javascript - 是否可以简化从二维数组中的一个数组中搜索重叠元素以避免嵌套 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);
});
解决方案
你可以随身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; }
推荐阅读
- javascript - 带有内部 html 的 Javascript 弹出窗口无法打开
- javascript - 如何创建点击计数器?
- python - 为什么我的多处理可能会暂停一段时间?
- c++ - 我无法让 GLEW 在 ubuntu 20.04 (C++) 中处理 netbeans
- python - 如何创建值在不同时间变化的元组生成器
- python - 如何在同一行上打印 if 语句
- visual-studio - 字符串太大,无法使用 UTF-8 进行编码,而是在 Visual Studio 2019 for Xamarin.android 项目中写为“STRING_TOO_LARGE”
- regex - Powershell Regex:如果它包含一个既不在开头也不在结尾的句点,则匹配整个字符串
- php - PHP警告Wordpress中的非法字符串'privacy_policy'
- javascript - 如何根据两个属性获取数组中重复项的总和并返回两个数组?