값 배열을 사용하는 lodash 필터 컬렉션
속성 값 배열을 사용하여 컬렉션을 필터링하고 싶습니다. ID 배열이 주어지면 ID가 일치하는 개체를 반환합니다. lodash
/를 사용하는 바로 가기 방법이 underscore
있습니까?
var collections = [{ id: 1, name: 'xyz' },
{ id: 2, name: 'ds' },
{ id: 3, name: 'rtrt' },
{ id: 4, name: 'nhf' },
{ id: 5, name: 'qwe' }];
var ids = [1,3,4];
// This works, but any better way?
var filtered = _.select(collections, function(c){
return ids.indexOf(c.id) != -1
});
이런 종류의 패턴을 많이 사용하려는 경우 다음과 같은 믹스 인을 만들 수 있지만 원래 코드와 근본적으로 다른 것은 없습니다. 개발자 친화적으로 만듭니다.
_.mixin({
'findByValues': function(collection, property, values) {
return _.filter(collection, function(item) {
return _.contains(values, item[property]);
});
}
});
그러면 이렇게 사용할 수 있습니다.
var collections = [
{id: 1, name: 'xyz'},
{id: 2, name: 'ds'},
{id: 3, name: 'rtrt'},
{id: 4, name: 'nhf'},
{id: 5, name: 'qwe'}
];
var filtered = _.findByValues(collections, "id", [1,3,4]);
업데이트 -위의 답변은 오래되고 투박합니다. 훨씬 더 우아한 솔루션을 위해 Adam Boduch 의 답변을 사용하십시오 .
_(collections)
.keyBy('id') // or .indexBy() if using lodash 3.x
.at(ids)
.value();
indexBy () 및 at () 을 사용하는 간결한 lodash 솔루션 .
_(collections)
.indexBy('id')
.at(ids)
.value();
다음과 같이 필터링 할 수도 있습니다.
var collections = [{ id: 1, name: 'xyz' },
{ id: 2, name: 'ds' },
{ id: 3, name: 'rtrt' },
{ id: 4, name: 'nhf' },
{ id: 5, name: 'qwe' }];
var filtered_ids = _.filter(collections, function(p){
return _.includes([1,3,4], p.id);
});
console.log(filtered_ids);
나는 jessegavin의 대답을 좋아 하지만 깊은 속성 일치를 위해 lodash-deep 을 사용하여 확장했습니다 .
var posts = [{ term: { name: 'A', process: '123A' } },
{ term: { name: 'B', process: '123B' } },
{ term: { name: 'C', process: '123C' } }];
var result = _.filterByValues(posts, 'term.process', ['123A', '123C']);
// results in objects A and C to be returned
_.mixin({
'filterByValues': function(collection, key, values) {
return _.filter(collection, function(o) {
return _.contains(values, resolveKey(o, key));
});
}
});
function resolveKey(obj, key) {
return (typeof key == 'function') ? key(obj) : _.deepGet(obj, key);
}
lodash-deep을 신뢰하지 않거나 이름에 점이있는 속성에 대한 지원을 원하는 경우 다음은보다 방어적이고 강력한 버전입니다.
function resolveKey(obj, key) {
if (obj == null || key == null) {
return undefined;
}
var resolved = undefined;
if (typeof key == 'function') {
resolved = key(obj);
} else if (typeof key == 'string' ) {
resolved = obj[key];
if (resolved == null && key.indexOf(".") != -1) {
resolved = _.deepGet(obj, key);
}
}
return resolved;
}
이 답변 중 많은 부분이 구식이거나 Lodash 문서에 나열되지 않은 보조 기능이 포함되어 있음을 알았습니다. 허용되는 답변에는 더 이상 사용되지 않는 기능이 포함되어 _.contains
있으므로 업데이트해야합니다.
그래서 여기에 내 ES6 답변이 있습니다.
_.mixin( {
filterByValues: ( c, k, v ) => _.filter(
c, o => _.indexOf( v, o[ k ] ) !== -1
)
} );
그리고 다음과 같이 호출됩니다.
_.filterByValues(
[
{
name: 'StackOverflow'
},
{
name: 'ServerFault'
},
{
name: 'AskDifferent'
}
],
'name',
[ 'StackOverflow', 'ServerFault' ]
);
// => [ { name: 'StackOverflow' }, { name: 'ServerFault' } ]
고유하지 않은 값을 필터링하고 싶었 기 때문에 이러한 답변은 저에게 효과적이지 않았습니다. 당신이 변경하는 경우 keyBy
에 groupBy
당신은에 의해 얻을 수 있습니다.
_(collections)
.groupBy(attribute)
.pick(possibleValues)
.values()
.flatten()
.value();
내 최초 사용 일을 드롭했다, 그래서 나는 밖으로 전환 pick
과 함께 omit
.
Thanks Adam Boduch for the starting point.
This worked great for me:
let output = _.filter(collections, (v) => _.includes(ids, v.id));
ReferenceURL : https://stackoverflow.com/questions/17251764/lodash-filter-collection-using-array-of-values
'programing' 카테고리의 다른 글
얼굴 감지 후 사진 자동 자르기 (0) | 2021.01.17 |
---|---|
Charles Proxy로 상태 코드를 다시 작성할 수 있습니까? (0) | 2021.01.17 |
Rails 4.0의 Devise에 새 필드를 추가하는 허용되지 않는 매개 변수 (0) | 2021.01.17 |
잘못된 이미지 경로- "CFBundleIconFile"키 아래에 참조 된 경로에 이미지가 없습니다. Icon.png (0) | 2021.01.17 |
Github에서 푸시 커밋시 오류 : 치명적 : 사용자 이름을 읽을 수 없음 (0) | 2021.01.17 |