dire che ho un array come questo: [1, 1, 2, 2, 3]
lodash: Ottenere i valori duplicati di un array
voglio ottenere i duplicati che sono in questo caso: [1, 2]
Does lodash supporto questo? Voglio farlo nel modo più breve possibile.
dire che ho un array come questo: [1, 1, 2, 2, 3]
lodash: Ottenere i valori duplicati di un array
voglio ottenere i duplicati che sono in questo caso: [1, 2]
Does lodash supporto questo? Voglio farlo nel modo più breve possibile.
È possibile utilizzare questo:
_.filter(array, function (value, index, iteratee) {
return _.includes(iteratee, value, index + 1);
});
Nota che se un numero compare più di due volte nel vostro array si può sempre utilizzare _.uniq
.
Questo e spettacolare! –
One-liner, con un po 'di zucchero ES2015: 'const duplicates = _.filter (array, (valore, indice, iteratee) => _.include (iteratee, valore, indice + 1))' –
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})));
Questo funziona anche per gli array non ordinati.
Questo sembra essere significativamente più veloce per gli array più grandi rispetto alla risposta accettata. Bel lavoro. –
Un altro modo, ma usando filtri e ECMAScript 2015 (ES6)
var array = [1, 1, 2, 2, 3];
_.filter(array, v =>
_.filter(array, v1 => v1 === v).length > 1);
//→ [1, 1, 2, 2]
Mi piace, molto semplice! Il trucco è che identifica se ne esiste più di uno nel sub-filtro. – KLVTZ
ne dite di usare countBy()
seguito da reduce()
?
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]
Un altro modo è quello di gruppo con oggetti unici, e restituire le chiavi di gruppo che hanno più di 1 articolo
_([1, 1, 2, 2, 3]).groupBy().pickBy(x => x.length > 1).keys().value()
Ebbene si può utilizzare questo pezzo di codice che è molto più veloce in quanto ha una complessità di O (n) e questo non usa Lodash.
[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]
È già stato ordinato un array? – Kiril
Possibile duplicato di [Uso di lodash per verificare se un array ha valori duplicati] (http://stackoverflow.com/questions/28461014/using-lodash-to-check-whether-an-array-has-duplicate-values) – Gajus