JS:过滤对象列表以仅包含在第二个数组中找到的字符串

我有一个类似于以下内容的对象数组:


let array = [

{

id: 1,

name: Foo,

tools: [{id:3, toolname: Jaw},{id:1, toolname: Law}]

},

{

id: 2,

name: Boo,

tools: [{id:2, toolname: Caw}]

},

{

id: 3,

name: Loo,

tools: [{id:3, toolname: Jaw}, {id:4, toolname: Maw}, {id:6, toolname: Taw}]

}

]

我有第二个数组,如下所示:


let secondarray = ['Jaw', 'Taw']

如何返回仅包含第二个数组中两个项目的对象列表?因此,如果一个对象只有两者中的一个,则不会包含该对象。此外,如果对象包含其他不在 中,但同时包含 两项,则仍应包含它。toolssecondarraysecondarray


因此,此滤波器的预期输出为:


{

id: 3,

name: Loo,

tools: [{id:3, toolname: Jaw}, {id:4, toolname: Maw}, {id:6, toolname: Taw}]

}

感谢您抽出宝贵时间接受采访!


慕少森
浏览 101回答 1
1回答

波斯汪

您可以迭代数据数组,然后检查所有需要的工具是否都在实际对象中。let array = [{ id: 1, name: 'Foo', tools: [{ id: 3, toolname: 'Jaw' }, { id: 1, toolname: 'Law' }] }, { id: 2, name: 'Boo', tools: [{ id: 2, toolname: 'Caw' }] }, { id: 3, name: 'Loo', tools: [{ id: 3, toolname: 'Jaw' }, { id: 4, toolname: 'Maw' }, { id: 6, toolname: 'Taw' }] }],    required = ['Jaw', 'Taw'],    result = array.filter(({ tools }) =>        required.every(v => tools.some(({ toolname }) => toolname === v))    );console.log(result);.as-console-wrapper { max-height: 100% !important; top: 0; }另一种通过使用 Set 多次省略循环的方法。toolslet array = [{ id: 1, name: 'Foo', tools: [{ id: 3, toolname: 'Jaw' }, { id: 1, toolname: 'Law' }] }, { id: 2, name: 'Boo', tools: [{ id: 2, toolname: 'Caw' }] }, { id: 3, name: 'Loo', tools: [{ id: 3, toolname: 'Jaw' }, { id: 4, toolname: 'Maw' }, { id: 6, toolname: 'Taw' }] }],    required = ['Jaw', 'Taw'],    result = array.filter(({ tools }) =>         required.every(            Set.prototype.has,            new Set(tools.map(({ toolname }) => toolname))        )    );console.log(result);.as-console-wrapper { max-height: 100% !important; top: 0; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript