codememo

Javascript용 밑줄을 사용하여 중복 개체 제거

tipmemo 2023. 2. 16. 21:44
반응형

Javascript용 밑줄을 사용하여 중복 개체 제거

다음과 같은 배열이 있습니다.

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

다음을 포함하도록 필터링합니다.

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

_.uniq를 사용해 봤는데{ "a" : "1" }그 자체와 동등하지 않아요, 효과가 없어요.uniq에 overriden equals 함수를 제공하는 방법이 있습니까?

.uniq/.conf는 콜백을 받아들인다.

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" } ]

Atribute 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}]

언더스코어 unique lib following을 사용하는 것이 효과적입니다.이 경우 _id를 기반으로 목록을 고유하게 만든 후 _id의 String 값을 반환합니다.

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는, 2개의 오브젝트를 최적으로 상세하게 비교합니다.자세한 것에 대하여는, 밑줄 isEqual 의 메뉴얼을 참조해 주세요.

편집: 사용할 수 있도록 업데이트됨_.filter더 깔끔한 접근법입니다.

lodash 4.6.1 문서에는 오브젝트 키의 동일성에 대한 예로서 다음과 같은 것이 있습니다.

_.uniqWith(objects, _.isEqual);

https://lodash.com/docs#uniqWith

반복기 기능 사용

예를 들어 첫 번째 요소를 반환할 수 있습니다.

x = [['a',1],['b',2],['a',1]]

_.uniq(x,false,function(i){  

   return i[0]   //'a','b'

})

=> ['a', 1], ['b', 2]

솔루션(설명)은 다음과 같습니다.

_.mixin
  deepUniq: (coll) ->
    result = []
    remove_first_el_duplicates = (coll2) ->

      rest = _.rest(coll2)
      first = _.first(coll2)
      result.push first
      equalsFirst = (el) -> _.isEqual(el,first)

      newColl = _.reject rest, equalsFirst

      unless _.isEmpty newColl
        remove_first_el_duplicates newColl

    remove_first_el_duplicates(coll)
    result

예:

_.deepUniq([ {a:1,b:12}, [ 2, 1, 2, 1 ], [ 1, 2, 1, 2 ],[ 2, 1, 2, 1 ], {a:1,b:12} ]) 
//=> [ { a: 1, b: 12 }, [ 2, 1, 2, 1 ], [ 1, 2, 1, 2 ] ]

언더스코어를 사용하여 반복 함수에서 String()사용해야 했습니다.

function isUniq(item) {
    return String(item.user);
}
var myUniqArray = _.uniq(myArray, isUniq);

저는 이 간단한 해결책을 간단한 방법으로 해결하고 싶었고, 약간의 컴퓨터 비용을 들여서...하지만 최소한의 변수 정의를 가진 사소한 해결책 아닌가요?

function uniq(ArrayObjects){
  var out = []
  ArrayObjects.map(obj => {
    if(_.every(out, outobj => !_.isEqual(obj, outobj))) out.push(obj)
  })
  return out
}
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
var bar = _.map(_.groupBy(foo, function (f) { 
        return JSON.stringify(f); 
    }), function (gr) { 
        return gr[0]; 
    }
);

이것을 분해해 봅시다.먼저 어레이 항목을 문자열화된 값으로 그룹화합니다.

var grouped = _.groupBy(foo, function (f) { 
    return JSON.stringify(f); 
});

grouped외관:

{
    '{ "a" : "1" }' = [ { "a" : "1" } { "a" : "1" } ],
    '{ "b" : "2" }' = [ { "b" : "2" } ]
}

그러면 각 그룹의 첫 번째 요소를 잡겠습니다.

var bar = _.map(grouped, function(gr)
    return gr[0]; 
});

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

모든 것을 종합하면:

var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
var bar = _.map(_.groupBy(foo, function (f) { 
        return JSON.stringify(f); 
    }), function (gr) { 
        return gr[0]; 
    }
);

다음과 같은 간단한 방법으로 수행할 수 있습니다.

_.uniq(foo, 'a')

언급URL : https://stackoverflow.com/questions/9923890/removing-duplicate-objects-with-underscore-for-javascript

반응형