2015-07-28 7 views
14

Sagen wir, ich habe ein Array wie folgt aus: [1, 1, 2, 2, 3]lodash: Erhalten Sie doppelte Werte aus einem Array

Ich möchte die Duplikate erhalten, die in diesem Fall sind: [1, 2]

Hat lodash Unterstützung das? Ich möchte es so kurz wie möglich machen.

+0

Ist ein Array bereits sortiert? – Kiril

+0

Mögliches Duplikat von [Mit lodash prüfen, ob ein Array doppelte Werte hat] (http://stackoverflow.com/questions/28461014/using-lodash-to-check-whether-an-array-has-duplicate-values) – Gajus

Antwort

21

Sie können diese verwenden:

_.filter(array, function (value, index, iteratee) { 
    return _.includes(iteratee, value, index + 1); 
}); 

Beachten Sie, dass, wenn eine Anzahl von mehr als zwei Mal im Array erscheinen Sie immer _.uniq verwenden können.

+2

Das ist fantastisch! –

+2

One-Liner, mit einigen ES2015 Zucker: 'const duplicates = _.filter (Array, (Wert, Index, Iteratee) => _.includes (iteratee, Wert, Index + 1))' –

6
var array = [1, 1, 2, 2, 3]; 
var groupped = _.groupBy(array, function (n) {return n}); 
var result = _.uniq(_.flatten(_.filter(groupped, function (n) {return n.length > 1}))); 

Dies funktioniert auch für unsortierte Arrays.

+0

Dies scheint deutlich schneller zu sein für größere Arrays als die akzeptierte Antwort ist. Gute Arbeit. –

3

Eine andere Art und Weise, aber unter Verwendung von Filtern und EcmaScript 2015 (ES6)

var array = [1, 1, 2, 2, 3]; 

_.filter(array, v => 
    _.filter(array, v1 => v1 === v).length > 1); 

//→ [1, 1, 2, 2] 
+0

Ich mag, sehr einfach! Der Trick besteht darin, dass es identifiziert, ob mehr als eine auf dem Subfilter existiert. – KLVTZ

3

Wie wäre es countBy() von reduce() gefolgt mit?

const items = [1,1,2,3,3,3,4,5,6,7,7]; 

const dup = _(items) 
    .countBy() 
    .reduce((acc, val, key) => val > 1 ? acc.concat(key) : acc, []) 
    .map(_.toNumber) 

console.log(dup); 
// [1, 3, 7] 

http://jsbin.com/panama/edit?js,console

10

Ein anderer Weg ist durch einzigartige Gegenstände zu gruppieren, und geben die Gruppenschlüssel, der mehr als 1 Stück haben

_([1, 1, 2, 2, 3]).groupBy().pickBy(x => x.length > 1).keys().value() 
1

Nun können Sie dieses Stück Code benutzen, die viel schneller, da es eine Komplexität von O (n) hat und Lodash nicht verwendet.

[1, 1, 2, 2, 3] 
.reduce((agg,col) => { 
    agg.filter[col] = agg.filter[col]? agg.dup.push(col): 2; 
    return agg 
}, 
{filter:{},dup:[]}) 
.dup; 

//result:[1,2]