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}]
주의:
- 비교에 사용되는 콜백 반환값
- 고유 반환값을 고유하게 사용하는 첫 번째 비교 개체
- underscorejs.org은 콜백 사용법을 나타내지 않습니다.
- 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
'codememo' 카테고리의 다른 글
| 리액트 리액트 리액트 리액트 리액트 리액트 리액트 리액트 리 (0) | 2023.02.16 |
|---|---|
| 폼 제출 시 모든 폼 필드를 ng-touched로 프로그래밍 방식으로 설정 (0) | 2023.02.16 |
| Oracle의 열 조합에 고유한 제약을 가하려면 어떻게 해야 합니까? (0) | 2023.02.16 |
| AngularJS 드롭다운 필수 유효성 검사 (0) | 2023.02.16 |
| angularjs의 ng-bind 필터를 사용한 후 텍스트 추가 (0) | 2023.02.16 |