[英]How can I minimize a code function that finds repeated values in an array of objects in JavaScript?
我需要修復這個函數,它必須在對象數組中找到兩個相似的名稱。
我嘗試這樣做,並且它正在工作,但是測試告訴我它應該只有一個循環和一個 if
function searchByName() {
const values = [
{ name: 'Johny Walker', birthDate: '1995-12-17' },
{ name: 'Andrew', birthDate: '2001-10-29' },
{ name: 'Viktor', birthDate: '1998-11-09' },
{ name: 'Andrew', birthDate: '2011-05-09' }
];
for (let obj of values) {
for (let elem of values) {
if (obj == elem)
continue;
if (elem.name === obj.name && elem.age === obj.age) {
console.log(obj);
break;
}
}
}
};
這是必須出來的例子:
[
{ name: 'Andrew', birthDate: '2001-10-29' },
{ name: 'Andrew', birthDate: '2011-05-09' }
]
Array.reduce
函數按name
鍵查找重復計數。Array.filter
& Array.map
顯示它們。 const values = [ { name: 'Johny Walker', birthDate: '1995-12-17' }, { name: 'Andrew', birthDate: '2001-10-29' }, { name: 'Viktor', birthDate: '1998-11-09' }, { name: 'Andrew', birthDate: '2011-05-09' } ]; let duplicates = values.reduce((acc, cur) => { if (acc[cur.name]) { acc[cur.name].push(cur.birthDate); } else { acc[cur.name] = [ cur.birthDate ]; } return acc; }, {}); duplicates = Object.entries(duplicates).filter(([name, birth]) => birth.length > 1).map(([name, birth]) => { return birth.map((item) => ({ name, birthDate: item })); }); console.log(duplicates);
您可以使用reduce
方法迭代數組並將項目推入數組。 然后我們只需按數組的長度過濾數組。 因此,如果長度大於 1,則表示我們找到了重復項:
const result = values.reduce((a, c)=> {
a[c.name] = a[c.name] || {...c, items: []} ;
a[c.name].items.push(c);
return a;
}, { });
let result = Object.values(result).filter(f => f.items.length > 1).flatMap(s => s.items);
一個例子:
const values = [ { name: 'Johny Walker', birthDate: '1995-12-17' }, { name: 'Andrew', birthDate: '2001-10-29' }, { name: 'Viktor', birthDate: '1998-11-09' }, { name: 'Andrew', birthDate: '2011-05-09' } ]; const result = values.reduce((a, c)=> { a[c.name] = a[c.name] || {...c, items: []} ; a[c.name].items.push(c); return a; }, { }); console.log(Object.values(result).filter(f => f.items.length > 1).flatMap(s => s.items));
只需將名稱推送到數組並在重復時停止:
let hasDuplicates = [];
values.forEach((e, idx) => {
if(!hasDuplicates.includes(e.name))
if(idx !== values.length-1) { hasDuplicates.push(e.name); }
else { hasDuplicates = false; }
else { hasDuplicates = e; }
});
然后您可以使用該變量:
if(hasDuplicates) {...}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.