我正在尝试将两个不同的数组进行比较,一个是前一个数组,另一个是当前数组。上一组数据包含:
[
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"}
]
新集合包含:
[
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"},
{"member_name":"Test1","item":"Shield"}
]
因此,如您所见,Test1获得了一个新项目。我试图通过几种方法将这两个数组进行比较,但无济于事。
我尝试过的方法:
这只是返回整个数组。不是单个项目。
Items_Curr.filter(function(item) { return !Items_Prev.includes(item); });
此方法仅返回3个未定义的。
Items_Curr.map(e => { e.member_name });
我一直在寻找尝试做到这一点的方法,但是其他文章只是解释了确定简单数组中的更改的方法。
E [a,b] - [a, b, c]
更新:
最终目标是我想创建一个新数组'NewItems',其中将包含所有新添加的名称和项目的数组。因此,如果有更改,我希望将其广播;如果没有更改,请忽略该功能,直到再次运行该功能。
答案 0 :(得分:4)
实际上,您想要执行以下操作:
[a, b, c] - [a, b]
哪个会给您c
。您可以使用.some
来实现此目的,它可以“自定义”包含功能。
请参见以下示例:
const arr1 = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"}
];
const arr2 = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"},
{"member_name":"Test1","item":"Shield"}
];
const res = arr2.filter(({member_name:a, item:x}) => !arr1.some(({member_name:b, item:y}) => a === b && x === y));
console.log(res);
答案 1 :(得分:2)
如果您知道属性将始终保持相同的顺序,则可以使用JSON.stringify
序列化对象并比较结果:
const Items_Prev = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"}
]
const Items_Curr = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"},
{"member_name":"Test1","item":"Shield"}
]
const serialized_Items_Prev = Items_Prev.map(i => JSON.stringify(i));
const NewItems = Items_Curr.filter(i => !serialized_Items_Prev.includes(JSON.stringify(i)));
console.log(NewItems);
答案 2 :(得分:1)
我认为如果对象的键不变并且最后才添加新项,则需要执行此操作。
const array1 = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"}
];
const array2 = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"},
{"member_name":"Test1","item":"Shield"}
];
const compare = (array1, array2) => {
if (array1.length !== array2.length) {
return false;
}
for (let i = 0; i < array1.length; i += 1) {
if (array1[i].member_name !== array2[i].member_name) {
return false;
}
if (array1[i].item !== array2[i].item) {
return false;
}
}
return true;
};
console.log(compare(array1, array2));
如果对象的顺序发生变化,则需要为数组编写排序算法,然后进行比较。
答案 3 :(得分:0)
您可以使用数组方法filter()和findIndex()来实现它
使用当前数组上的findIndex()函数过滤当前数组
var prevItems = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"}
]
var currItems = [
{"member_name":"Test1","item":"Sword"},
{"member_name":"Test2","item":"Sword"},
{"member_name":"Test1","item":"Shield"},
{"member_name":"Test2","item":"Shield"}
]
var newItems = currItems.filter(function(currItem ){
return prevItems.findIndex(function(prevItem){
return prevItem.member_name == currItem.member_name &&
prevItem.item == currItem.item
}) == -1
})
console.log(newItems)