All I need to do is compare two arrays of objects and remove items in the second one that have the same property value. For example:
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);
I cannot understand why this does not work and instead gives:
Uncaught TypeError: Cannot read property 'name' of undefined
What I expected was the following content in 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;
}
}
}
Instead of using two loops you might also use the findIndex function:
for (var i = 0, len = a.length; i < len; i++) {
var ItemIndex = b.findIndex(b => b.name === a[i].name);
a.splice(ItemIndex, 1)
}
Or if you want to go completely without using a loop you might use the forEach function
a.forEach(function(item, index, array) {
var ItemIndex = b.findIndex(b => b.name === item.name);
a.splice(ItemIndex, 1)
}
Your problem is, that splice()
will change the length of the array, so that your precalculated len
value will be too large and the inside the loop you try to access undefined elements.
A possible solution would be to use the filter()
method:
function remove_duplicates(a, b) {
b = b.filter( function( item ) {
for( var i=0, len=a.length; i<len; i++ ){
if( a[i].name == item.name ) {
return false;
}
}
return true;
});
console.log(a);
console.log(b);
}
You just need to break the inner loop when a match is found:
if (a[i].name == b[j].name) {
b.splice(j, 1);
break;
}
Try this:
You are starting loop from the 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);
}
}
}
compare and remove in array of object.Typically array of object data type may be typeOf is object.So that we need to convert into JSON stringify and then check condition..
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;
})
Depending on which Objects you want to remove use:
Also to find common Objects list just add use return index != -1
PS: Refer my Github for Array Data Manipulation examples in Javascript
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.