Получить массив дубликатов
Есть некоторый массив объектов. Необходимо получить новый массив состоящий только из дубликатов массива-исходника по конкретному свойству объекта.
Пример
Массив:
[{car: 'volga'},
{car: 'lada'},
{car: 'volga'},
{car: 'volga'}]
Стало:
[{car: 'volga'},
{car: 'volga'},
{car: 'volga'}]
Сейчас делаю так (необходимо найти дубли по свойству account), но если объектов скажем 100к, то весь этот процесс выполняется довольно долго, вероятно есть решения лучше и быстрее. Прошу подсказать) Спасибо!
const items = [{
oid: 1,
account: 'price003',
category: 'FACT',
},
{
oid: 2,
account: 'price004',
category: 'FACT',
},
{
oid: 3,
account: 'price003',
category: 'FACT',
},
{
oid: 4,
account: 'price004',
category: 'FACT',
},
{
oid: 5,
account: 'price04',
category: 'FACT',
}]
let nonUniqItems = []
for (let i of items) {
for (let k of items) {
if (i.account == k.account && i.oid !== k.oid) {
if (!nonUniqItems.find(item => item.oid == i.oid)) nonUniqItems.push(i)
}
}
}
console.log(nonUniqItems)
Ответы (1 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
Цикл for...of сам по себе медленнее какого-нибудь forEach. Если нужна скорость, в первую очередь стоит избавиться от него.
const items = [
{ oid: 1, account: 'price003', category: 'FACT' },
{ oid: 2, account: 'price004', category: 'FACT' },
{ oid: 3, account: 'price003', category: 'FACT' },
{ oid: 4, account: 'price004', category: 'FACT' },
{ oid: 5, account: 'price04', category: 'FACT' }
];
let accs = items.map(item => item.account);
// Отдельно собрать все значения .account
// ['price003', 'price004', ...'price04'];
let nonUniqItems = items.filter((item, i) => {
return accs.indexOf(item.account) != i || accs.lastIndexOf(item.account) != i;
// Если и слева, и справа, индекс совпадает с текущим, значит он один единственный.
});
console.log(nonUniqItems);