比较两个JavaScript数组并删除重复的条目

时间:2019-03-22 04:48:16

标签: javascript arrays

我正在尝试将两个不同的数组进行比较,一个是前一个数组,另一个是当前数组。上一组数据包含:

[
  {"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',其中将包含所有新添加的名称和项目的数组。因此,如果有更改,我希望将其广播;如果没有更改,请忽略该功能,直到再次运行该功能。

4 个答案:

答案 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)