【问题标题】:Compare two javascript arrays and remove duplicate entries比较两个 javascript 数组并删除重复条目
【发布时间】:2019-03-22 04:48:16
【问题描述】:

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

[
  {"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.G [a,b] - [a, b, c]

更新:

最终目标是我想创建一个新数组“NewItems”,其中包含所有新添加的名称和项目的数组。所以如果有变化,我希望广播,如果没有变化,则忽略,直到再次运行该函数。

【问题讨论】:

  • 你需要自己编写比较方法。
  • 我认为您的问题缺少一些信息。期望的输出是什么?你想让它看起来像什么。比如,你想知道什么是新的还是删除重复的?
  • 就像@Shubham 所说,您需要比较每个项目中的每个键值对,然后将唯一的项目推送到新数组中
  • 我已经更新了@Sinaesthetic 的帖子也很公平,我将如何比较每个键值,是否会通过每个项目的 for 循环?我的主数组中有 270 个项目。那么这是否意味着如果有新项目,它需要扫描所有 230 个项目 231 次?这似乎是负载密集型的。
  • 没有 JSON 数组这样的东西。 JSON 总是 一个字符串。你有一个对象数组。

标签: javascript arrays


【解决方案1】:

实际上你想做这样的事情:

[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);

【讨论】:

  • 这也很有效,我不知道您可以将 {} 元素添加到过滤器或某些行中。
  • @T3rr11 别担心,这就是destructuring assignment
【解决方案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);

【讨论】:

    【解决方案3】:

    我认为如果对象的键没有改变并且最后才添加新项目,您需要这样做。

    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));

    如果对象的顺序发生变化,则需要为数组编写排序算法,然后进行比较。

    【讨论】:

    • 什么是数组项不按顺序排列?
    • 我觉得这是一个很好的答案,但对于较大的阵列,它会产生相当大的负载,不是吗?
    • 我也喜欢你比较数组的长度,这确实有助于提高性能!
    • @T3rr11 会的。但第一个答案只是比较字符串。如果订单发生变化,则会导致问题。
    • @T3rr11 基本上是过滤器,有些还在其中使用循环。所以我的答案是只使用单个循环,并且一旦获得差异,循环也会中断。这个函数看起来很大,但我认为它更有效。
    【解决方案4】:

    您可以使用数组方法 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)

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 2020-12-14
      • 2013-10-11
      • 1970-01-01
      • 2012-08-21
      • 2021-05-09
      • 2012-01-31
      • 2020-05-08
      • 1970-01-01
      相关资源
      最近更新 更多