![](/img/trans.png)
[英]How to compare Between two arrays and check if all items in one are in the second?
[英]Compare two arrays of objects and remove items in the second one that have the same property value
我需要做的就是比较两个对象数组并删除第二个对象中具有相同属性值的项目。 例如:
var a = [{'name':'bob', 'age':22}, {'name':'alice', 'age':12}, {'name':'mike', 'age':13}];
var b = [{'name':'bob', 'age':62}, {'name':'kevin', 'age':32}, {'name':'alice', 'age':32}];
function remove_duplicates(a, b) {
for (var i = 0, len = a.length; i < len; i++) {
for (var j = 0, len = b.length; j < len; j++) {
if (a[i].name == b[j].name) {
b.splice(j, 1);
}
}
}
console.log(a);
console.log(b);
}
console.log(a);
console.log(b);
remove_duplicates(a,b);
我不明白为什么这不起作用,而是给出:
Uncaught TypeError: Cannot read property 'name' of undefined
我期望的是 b 中的以下内容:
[{'name':'kevin', 'age':32}];
for (var i = 0, len = a.length; i < len; i++) {
for (var j = 0, len2 = b.length; j < len2; j++) {
if (a[i].name === b[j].name) {
b.splice(j, 1);
len2=b.length;
}
}
}
除了使用两个循环,您还可以使用 findIndex 函数:
for (var i = 0, len = a.length; i < len; i++) {
var ItemIndex = b.findIndex(b => b.name === a[i].name);
a.splice(ItemIndex, 1)
}
或者如果你想完全不使用循环,你可以使用 forEach 函数
a.forEach(function(item, index, array) {
var ItemIndex = b.findIndex(b => b.name === item.name);
a.splice(ItemIndex, 1)
}
您只需要在找到匹配项时中断内部循环:
if (a[i].name == b[j].name) {
b.splice(j, 1);
break;
}
试试这个:
您正在从0
开始循环。
for (var i = 0, len = a.length; i < len; i++) {
for (var j = 0, len = b.length; j < len-1; j++) {
if (a[i].name == b[j].name) {
b.splice(j, 1);
}
}
}
在对象数组中进行比较和删除。通常对象数据类型的数组可能是typeOf is object。所以我们需要转换成JSON stringify然后检查条件..
for(var i=0; i < a.length; i++) { for(var j=0; j < b.length; j++) { if(JSON.stringify(a[i]) == JSON.stringify(b[j])) { a.splice(i, 1); } } }
根本原因是您在 for 循环中直接从数组 b 拼接项目,并且前提条件是 a 和 b 具有相同数量的项目。
let A = [
{name: 'a', age: 20},
{name: 'b', age: 30},
{name: 'c', age: 10},
]
let B = [
{name: 'a', age: 20},
{name: 'b', age: 40},
{name: 'd', age: 10},
{name: 'e', age: 20},
{name: 'f', age: 10},
]
const compareName = (obj1, obj2)=>{
return (obj1.name === obj2.name);
}
const compareAll = (obj1, obj2)=>{
return (obj1.name === obj2.name && obj1.age=== obj2.age);
}
let output = B.filter(b=>{
let indexFound = A.findIndex(a => compareName(a, b));
return indexFound == -1;
})
根据您要删除的对象使用:
还要找到常见的对象列表,只需添加 use return index != -1
PS:请参阅我的Github中的 Javascript 数组数据操作示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.