簡體   English   中英

根據第二個數組中的值過濾對象數組

[英]Filter array of objects based on values in second array

我有一個對象數組,我想根據任何鍵的值是否匹配另一個數組中的任何值來過濾以創建一個新數組。

const array1 = [{name: 'pink', id: 13}, {name: 'orange', id: 17}, {name: 'red, id: 64}, {name: 'purple', id: 47}, {name: 'yellow', id: 23}, {name: 'gray', id: 2}, {name: 'black', id: 200}, {name: 'violet', id: 4}]

const array2 = ['red', 'blue', 'green', 'pink']

我試過在返回函數中使用for ... of循環,但這給了我錯誤。

    const array3 = array1.filter(color => {
        for (mainColor of array2){
            return color.name === mainColor 
        }
    });

這有效,但顯然不是最佳方法。

    const array3 = array1.filter(color => {
            return (color.main === 'red') || (color.main === 'blue')
        });

如何從array1獲得第三個數組,該數組僅包含array1.name與array2中的值匹配的對象?

ES6或Lodash是否有可能?

提前致謝!

幾乎在那里,而不是for循環使用includesreturn

const array3 = array1.filter(color => {
    return array2.includes ( color.name );
});

要么

const array3 = array1.filter( color => array2.includes ( color.name ) );

讓我給出一個替代方案,它具有稍微更多的代碼,但是效率也更高,因為它只需要掃描一次array2

 const array1 = [{name: 'pink', id: 13}, {name: 'orange', id: 17}, {name: 'red', id: 64}, {name: 'purple', id: 47}, {name: 'yellow', id: 23}, {name: 'gray', id: 2}, {name: 'black', id: 200}, {name: 'violet', id: 4}], array2 = ['red', 'blue', 'green', 'pink']; const colorSet = new Set(array2), array3 = array1.filter(color => colorSet.has(color.name)); console.log(array3); 

使用Array的includes()嘗試以下操作:

 const array1 = [{name: 'pink', id: 13}, {name: 'orange', id: 17}, {name: 'red', id: 64}, {name: 'purple', id: 47}, {name: 'yellow', id: 23}, {name: 'gray', id: 2}, {name: 'black', id: 200}, {name: 'violet', id: 4}] const array2 = ['red', 'blue', 'green', 'pink']; const array3 = array1.filter(color => array2.includes(color.name)); console.log(array3); 

filter方法已經在每個項目上進行迭代。 如果該元素存在於第二個數組中,則只需return true (通過使用indexOfincludes

 const array1 = [{name: 'pink', id: 13}, {name: 'orange', id: 17}, {name: 'red', id: 64}, {name: 'purple', id: 47}, {name: 'yellow', id: 23}, {name: 'gray', id: 2}, {name: 'black', id: 200}, {name: 'violet', id: 4}] const array2 = ['red', 'blue', 'green', 'pink']; let filteredArray = array1.filter(e => array2.indexOf(e.name) > -1); console.log(filteredArray); 

我知道indexOf可能看起來有些過時且具有ES5風格,但仍然可以完成工作:

 const array1 = [{name: 'pink', id: 13}, {name: 'orange', id: 17}, {name: 'red', id: 64}, {name: 'purple', id: 47}, {name: 'yellow', id: 23}, {name: 'gray', id: 2}, {name: 'black', id: 200}, {name: 'violet', id: 4}], array2 = ['red', 'blue', 'green', 'pink']; let array3 = array1.filter(x => array2.indexOf(x.name) != -1) console.log(array3) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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