簡體   English   中英

如何最小化在 JavaScript 中的對象數組中查找重復值的代碼函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM