[javascript] Javascript 용 밑줄로 중복 개체 제거

이런 종류의 배열이 있습니다.

var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];

다음과 같이 필터링하고 싶습니다.

var bar = [ { "a" : "1" }, { "b" : "2" }];

_.uniq를 사용해 보았지만 { "a" : "1" }자신과 같지 않기 때문에 작동하지 않는 것 같습니다. 재정의 된 같음 함수와 함께 밑줄 uniq를 제공하는 방법이 있습니까?



답변

.uniq / .unique는 콜백을받습니다.

var list = [{a:1,b:5},{a:1,c:5},{a:2},{a:3},{a:4},{a:3},{a:2}];

var uniqueList = _.uniq(list, function(item, key, a) {
    return item.a;
});

// uniqueList = [Object {a=1, b=5}, Object {a=2}, Object {a=3}, Object {a=4}]

노트:

  1. 비교에 사용되는 콜백 반환 값
  2. 고유 한 반환 값이 사용 된 첫 번째 비교 개체
  3. underscorejs.org 는 콜백 사용이 없음을 보여줍니다.
  4. lodash.com 은 사용법을 보여줍니다

또 다른 예 :
콜백을 사용하여 목록에서 자동차 제조업체, 색상 추출


답변

ID를 기반으로 중복을 제거하려는 경우 다음과 같이 할 수 있습니다.

var res = [
  {id: 1, content: 'heeey'},
  {id: 2, content: 'woah'},
  {id: 1, content:'foo'},
  {id: 1, content: 'heeey'},
];
var uniques = _.map(_.groupBy(res,function(doc){
  return doc.id;
}),function(grouped){
  return grouped[0];
});

//uniques
//[{id: 1, content: 'heeey'},{id: 2, content: 'woah'}]


답변

Shiplu의 답변 구현.

var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];

var x = _.uniq( _.collect( foo, function( x ){
    return JSON.stringify( x );
}));

console.log( x ); // returns [ { "a" : "1" }, { "b" : "2" } ]


답변

속성 ID가있을 때 이것이 내가 선호하는 밑줄 방식입니다.

var x = [{i:2}, {i:2, x:42}, {i:4}, {i:3}];
_.chain(x).indexBy("i").values().value();
// > [{i:2, x:42}, {i:4}, {i:3}]


답변

밑줄 고유 lib를 사용하면 _id를 기반으로 목록을 고유하게 만든 다음 _id의 문자열 값을 반환합니다.

var uniqueEntities = _.uniq(entities, function (item, key, a) {
                                    return item._id.toString();
                                });


답변

다음은 깊은 객체 비교를 사용하여 중복을 확인하는 간단한 솔루션입니다 (비효율적이고 해키 인 JSON으로 변환하지 않고).

var newArr = _.filter(oldArr, function (element, index) {
    // tests if the element has a duplicate in the rest of the array
    for(index += 1; index < oldArr.length; index += 1) {
        if (_.isEqual(element, oldArr[index])) {
            return false;
        }
    }
    return true;
});

배열에서 나중에 중복 된 요소가 있으면 모든 요소를 ​​필터링하여 마지막 중복 요소가 유지되도록합니다.

_.isEqual두 개체 간의 최적화 된 심층 비교를 수행하는 중복 사용에 대한 테스트는 자세한 내용은 밑줄 isEqual 문서 를 참조하세요.

편집 : _.filter더 깨끗한 접근 방식 을 사용하도록 업데이트되었습니다.


답변

lodash 4.6.1 문서에는 객체 키 동등성에 대한 예제로 다음이 있습니다.

_.uniqWith(objects, _.isEqual);

https://lodash.com/docs#uniqWith