为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2022-09-29 10:24:04
我有一个类似于以下内容的对象数组: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}]}感谢您抽出宝贵时间接受采访!
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

您可以迭代数据数组,然后检查所有需要的工具是否都在实际对象中。


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 多次省略循环的方法。tools


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(

            Set.prototype.has,

            new Set(tools.map(({ toolname }) => toolname))

        )

    );


console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信