javascript - 如何检查对象是否存在于多个数组中
问题描述
首先,感谢您阅读我的问题并尝试帮助我并为我的英语道歉。
我的问题是我想实现一个很好的解决方案,在数组中使用更少的数组。
我有 n 个包含 n 个对象的数组,每个对象都有两个属性:名称和类型。我想知道如何获取所有数组中重复的对象。
这是我的代码:
let arraysNoEmpties = [...res].filter(array => array.length > 0);
let attributes = arraysNoEmpties[0].map(p => {
return { name: p.name, type: p.type };
});
let items = getAtributeInAllArrays(attributes, arraysNoEmpties);
console.log('items: ', items);
const getAtributeInAllArrays = (properties, list) => {
let items = [];
for (let i = 0; i < properties.length; i++) {
const property = properties[i];
let numTimes = 0;
for (let j = 0; j< list.length; j++) {
const array = list[j];
let propsOfarray = array.map(atr => atr.name);
if (propsOfarray.indexOf(property.name) !== -1) {
numTimes++;
if (numTimes === list.length) {
items.push(property);
}
}
}
}
items.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));
return items;
};
解决方案
您想要过滤在提供的每个数组中找不到的每个对象。我们可以利用一些函数来实现这一点:
let arrays = [[{name:"1"}, {name:"2"}], [{name:"1"}]]
let objects = [{name:"1"}, {name:"2"}] // only the first object is found in each array
const objectsInEachArray = objects.filter(o => arrays.every(arr => arr.some(r => r.name == o.name && r.type == o.type)))
让我们停下来:
要检查一个对象是否包含在数组中,我们可以使用 array.some() 函数。在这里,我们返回一个布尔值来声明匹配与否。在这种情况下,我猜你想检查每个属性。在这里,您可以进行完整的相等检查(深或浅),或者在像这样的简单情况下,只需显式检查每个属性:
arr.some(r => r.name == o.name && r.type == o.type)
由于我们有多个数组,并且要求应该在每个数组中至少找到一次对象,我们必须调用 2 维数组上的 every 方法:
arrays.every(arr => arr.some(r => r.name == o.name && r.type == o.type))))
由于我们有多个对象,并且希望结果是一个只有匹配对象的数组,我们在对象数组上调用过滤器。
objects.filter(o => arrays.every(arr => arr.some(r => r.name == o.name && r.type == o.type)))))
objectsInEachArray
现在只包含在每个二级数组中找到的对象arrays
所以:
console.log(objectsInEachArray) -> [{name: "1"}]
推荐阅读
- angular - ANGULAR - 如何将 div 中的 mat-hint 或标签与 radio-group 居中对齐 - ANGULAR
- python - 边缘被节点隐藏
- r - 在 R Studio 中倾斜后如何保留变量标签?
- php - PHP添加数组中的所有值,不包括最后一个
- c# - 如何在restsharp中编写这个cURL?
- .net - linux中dumpheap sos插件中的未知类
- react-native - 如何在 react-native-video 中隐藏声音和全屏按钮
- docker - Cloudant docker 映像太旧,无法使用“分区”选项
- sql-server - SQL 查询使站点崩溃或没有从 SQL 响应以执行查询
- email - Sendy - OroCRM 是否可以使用 Sendy 扩展程序?