2015-01-09 1 views
3

중복 된 항목이 필요하고 특정 속성을 기반으로 항목을 인쇄 할 수있는 배열이 있습니다. 나는 underscore.js를 사용하여 고유 항목을 얻는 방법을 알고 있지만 내가 대신 복제의 고유 값밑줄을 사용하여 JavaScript 배열에서 중복을 얻는 방법

var somevalue=[{name:"john",country:"spain"},{name:"jane",country:"spain"},{name:"john",country:"italy"},{name:"marry",country:"spain"}] 


var uniqueList = _.uniq(somevalue, function (item) { 
     return item.name; 
    }) 

이 반환 찾을 필요가 :

[{name:"jane",country:"spain"},{name:"marry",country:"spain"}] 

하지만 실제로 반대

필요를
[{name:"john",country:"spain"},{name:"john",country:"italy"}] 

답변

3

원본 배열의 경우 uniq 배열의 값과 중복 항목 가져 오기에서 .filter() 및 .where()를 사용하십시오.

var uniqArr = _.uniq(somevalue, function (item) { 
    return item.name; 
}); 

var dupArr = []; 
somevalue.filter(function(item) { 
    var isDupValue = uniqArr.indexOf(item) == -1; 

    if (isDupValue) 
    { 
     dupArr = _.where(somevalue, { name: item.name }); 
    } 
}); 

console.log(dupArr); 

Fiddle

하나 개 이상의 중복 된 항목이있는 경우 두 번째 방법으로, 더 깨끗한 코드를 업데이트했습니다.

var dupArr = []; 
var groupedByCount = _.countBy(somevalue, function (item) { 
    return item.name; 
}); 

for (var name in groupedByCount) { 
    if (groupedByCount[name] > 1) { 
     _.where(somevalue, { 
      name: name 
     }).map(function (item) { 
      dupArr.push(item); 
     }); 
    } 
}; 

Look fiddle

+0

귀하의 바이올린은 꽤 많이 깨졌습니다 –

+0

왜? 콘솔 로그에서보세요 –

+0

요청은 dup 아이템이었습니다 –

9

순전히 기반 밑줄 방법이다 : 이것은 모든 배열을 생성 할

_.chain(somevalue).groupBy('name').filter(function(v){return v.length > 1}).flatten().value() 

는 그대로 각각의 중복 출력 배열만큼 것, 중복 중복.

_.chain(somevalue).groupBy('name').filter(function(v){return v.length > 1}).uniq().value() 

이 수행하는 방법을 모른다, 그러나 나는

:-) ... 내 하나의 라이너를 사랑합니까 : 당신이 각 중복의 1 개 사본을 원하는 경우에, 당신은 단순히과 같이 체인에 .uniq()을 추가 할 수 있습니다
+0

두 번째 줄이 작동하지 않는 것 같습니다. – steph643

+0

'.flatten()'호출이 누락되었습니다. – chmac