根据第二个数组中的值过滤对象数组

问题描述 投票:1回答:5

我有一个对象数组,我想根据任何键的值是否与另一个数组中的任何值匹配来创建一个新数组。

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可以吗?

提前致谢!

javascript arrays ecmascript-6 lodash
5个回答
4
投票

几乎在那里,而不是for循环使用includesreturn

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

要么

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

3
投票

让我给出一个替代方案,它有更多的代码,但也更高效,因为它只需要扫描一次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);

1
投票

使用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);

0
投票

filter方法已经迭代了每个项目。如果元素存在于第二个数组中(通过使用returntrue),你只需要indexOf 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'];

let filteredArray = array1.filter(e => array2.indexOf(e.name) > -1);

console.log(filteredArray);

0
投票

我知道indexOf可能看起来有点过时了,ES5-ish,但它仍然可以完成这项工作:

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)
© www.soinside.com 2019 - 2024. All rights reserved.