Say У меня есть массив как это: [1, 1, 2, 2, 3]
lodash: Получить повторяющиеся значения из массива
Я хочу, чтобы получить дубликаты, которые в этом случае: [1, 2]
ли lodash поддержка этого? Я хочу сделать это как можно короче.
Say У меня есть массив как это: [1, 1, 2, 2, 3]
lodash: Получить повторяющиеся значения из массива
Я хочу, чтобы получить дубликаты, которые в этом случае: [1, 2]
ли lodash поддержка этого? Я хочу сделать это как можно короче.
Вы можете использовать это:
_.filter(array, function (value, index, iteratee) {
return _.includes(iteratee, value, index + 1);
});
Обратите внимание, что если число появляется более чем в два раза в массиве, вы всегда можете использовать _.uniq
.
Это круто! –
Один слой с сахаром ES2015: 'const duplicates = _.filter (array, (value, index, iteratee) => _.includes (iteratee, value, index + 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})));
Это работает и для несортированных массивов.
Это кажется значительно быстрее для больших массивов, чем принятый ответ. Хорошая работа. –
Другой способ, но с использованием фильтров и ECMAScript 2015 (ES6)
var array = [1, 1, 2, 2, 3];
_.filter(array, v =>
_.filter(array, v1 => v1 === v).length > 1);
//→ [1, 1, 2, 2]
Мне нравится, очень просто! Фокус в том, что он идентифицирует, существует ли более одного на субфильтре. – KLVTZ
Как об использовании countBy()
с последующим 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]
Другой способ состоит в группе уникальных предметов, и вернуть ключи групп, которые имеют более чем на 1 пункт
_([1, 1, 2, 2, 3]).groupBy().pickBy(x => x.length > 1).keys().value()
Ну вы можете использовать этот кусок кода, который намного быстрее, поскольку он имеет сложность O (n), и это не использует 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]
Является ли массив уже отсортированным? – Kiril
Возможный дубликат [Использование lodash для проверки того, имеет ли массив повторяющиеся значения] (http://stackoverflow.com/questions/28461014/using-lodash-to-check-whether-an-array-has-duplicate-values) – Gajus