首页 > 解决方案 > 是否可以简化从二维数组中的一个数组中搜索重叠元素以避免嵌套 for 循环?

问题描述

我有一个项目数组,我想从嵌套对象数组中删除(如果存在)。

var itemsToRemove = [1, 2, 3];

var data = [
    { id: 'a', list: [1, 3, 4, 5] },
    { id: 'b', list: [2, 6, 7] }
];

应该更新到

data = [
    { id: 'a', list: [4, 5] },
    { id: 'b', list: [6, 7] }
];

我可以将其减少为两个循环(如下)而不是三个,但我想知道是否有任何方法可以将其简化为一个循环/非嵌套循环。

data.forEach(obj => {
    var map = {};
    obj.list.forEach(el => map[el] = true);
    itemsToRemove.forEach(el => if(map[el] { delete map[el] }));
    obj.list = Object.keys(map);
});

标签: javascriptbig-o

解决方案


你可以随身Array#filter携带Array#includes

const
    itemsToRemove = [1, 2, 3],
    data = [
        { id: 'a', list: [1, 3, 4, 5] },
        { id: 'b', list: [2, 6, 7] }
    ];

data.forEach(o => o.list = o.list.filter(v => !itemsToRemove.includes(v)));

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

如果您需要更快的方法,您可以采用Set.

const
    itemsToRemove = [1, 2, 3],
    data = [
        { id: 'a', list: [1, 3, 4, 5] },
        { id: 'b', list: [2, 6, 7] }
    ],
    remove = new Set(itemsToRemove);

data.forEach(o => o.list = o.list.filter(v => !remove.has(v)));

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


推荐阅读