Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个javascript数组并删除重复项_Javascript_Arrays - Fatal编程技术网

比较两个javascript数组并删除重复项

比较两个javascript数组并删除重复项,javascript,arrays,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"}

我试图比较两个不同的阵列,一个以前的和一个当前的。上一组数据包含:

[
  {"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"}
]
新的一套包括:

[
  {"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 });
我一直在寻找实现这一点的方法,但其他文章只是解释了在更简单的数组中确定更改的方法

例如
[a,b]-[a,b,c]

更新:


最终目标是我想创建一个新的数组“NewItems”,它将包含所有新添加的名称和项目的数组。因此,如果有更改,我希望广播,如果没有更改,则忽略,直到函数再次运行。

如果您知道您的属性将始终以相同的顺序排列,则可以使用
JSON。stringify
序列化对象并比较结果:

const Items\u Prev=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”}
]
常量项目\u Curr=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”},
{“成员名称”:“测试1”,“项目”:“屏蔽”}
]
常量序列化的_Items_Prev=Items_Prev.map(i=>JSON.stringify(i));
const NewItems=Items\u Curr.filter(i=>!序列化的\u Items\u Prev.includes(JSON.stringify(i));

console.log(NewItems)我认为,如果对象的键没有改变,并且最后只添加了新项,则需要执行类似的操作

常量数组1=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”}
];
常数数组2=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”},
{“成员名称”:“测试1”,“项目”:“屏蔽”}
];
常量比较=(数组1,数组2)=>{
if(array1.length!==array2.length){
返回false;
}
对于(设i=0;ilog(比较(array1,array2))实际上,您希望执行以下操作:

[a, b, c] - [a, b] 
这将为您提供
c
。您可以使用
.some
实现这一点,它允许您“自定义”包含的功能

见下例:

const arr1=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”}
];
常数arr2=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”},
{“成员名称”:“测试1”,“项目”:“屏蔽”}
];
常量res=arr2.filter({member\u name:a,item:x})=>!arr1.some({member\u name:b,item:y})=>a==b&&x==y));

控制台日志(res)您可以使用数组方法filter()和findIndex()实现它

在前一个数组上使用out out of findIndex()函数筛选当前数组

var previitems=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”}
]
变量项目=[
{“成员名称”:“测试1”,“项目”:“剑”},
{“成员名称”:“测试2”,“项目”:“剑”},
{“成员名称”:“测试1”,“项目”:“屏蔽”},
{“成员名称”:“测试2”,“项目”:“屏蔽”}
]
var newItems=currItems.filter(函数(currItem){
返回PreviItems.findIndex(函数(PreviItem){
返回PreviItem.member\u name==currItem.member\u name&&
PreviItem.item==currItem.item
}) == -1
})

console.log(newItems)
您需要编写自己的比较方法。我认为您的问题缺少一些信息。期望的输出是什么?你想让它看起来像什么。比如,你想知道什么是新的还是删除重复项?就像@Shubham说的,你需要比较每个项目中的每个键值对,然后推送新阵列中唯一的项目。我已经更新了帖子@Sin美学也足够公平了,我如何比较每个键值,这会通过每个项目的for循环吗?我的主阵列中有270个项目。那么,这是否意味着如果有新项目,它需要扫描所有230个项目231次?这似乎是负载密集型的,没有JSON数组这样的东西。JSON总是一个字符串。您有一个对象数组。什么是数组项不符合顺序?我觉得这是一个很好的答案,但对于较大的数组,它会产生相当大的负载,不是吗?我也希望您比较数组的长度,这确实有助于提高性能@T3rr11会的。但第一个答案只是比较字符串。如果订单正在更改,则会导致问题。@T3rr11基本上是过滤器,有些还在其内部使用循环。所以我的答案是只使用单循环,循环在获得差异时也会中断。这个函数看起来很大,但我认为它更有效。这也很有魅力,我不知道你可以在过滤器或某行中添加{}元素。@T3rr11不用担心,这就是所谓的