获得两个对象数组之间差异的有效方法?

won*_*ng2 14 javascript arrays diff

我有两个对象数组:

var a = [  {'id': 20},   {'id': 15},   {'id': 10},   {'id': 17},   {'id': 23}  ];

var b = [ {'id': 90},   {'id': 15},    {'id': 17},   {'id': 23}  ];  
Run Code Online (Sandbox Code Playgroud)

我想得到一个在a中但不在b中的对象.此示例的结果将是:

{'id': 20}{'id': 10}.

因为数组可能很大,所以我需要一种有效的方法来做到这一点.

nin*_*cko 20

// Make hashtable of ids in B
var bIds = {}
b.forEach(function(obj){
    bIds[obj.id] = obj;
});

// Return all elements in A, unless in B
return a.filter(function(obj){
    return !(obj.id in bIds);
});
Run Code Online (Sandbox Code Playgroud)

非常小的附录:如果列表非常大并且你希望避免2个额外内存的因素,你可以首先将对象存储在一个hashmap中而不​​是使用列表,假设id是唯一的:a = {20:{etc:...}, 15:{etc:...}, 10:{etc:...}, 17:{etc:...}, 23:{etc:...}}.我个人会这样做.或者:其次,javascript就地排序列表,因此它不会使用更多内存.例如,a.sort((x,y)=>x.id-y.id)排序会比上面更差,因为它是O(N log(N)).但是如果你不得不对它进行排序,那么有一个O(N)算法涉及两个排序列表:即,你将两个列表一起考虑,并重复从列表中取最左边(最小)的元素(检查,然后增加)你所采用的列表中的指针/书签).这就像合并排序一样,但是要更加小心地找到相同的项目...而且可能会讨厌代码.第三,如果列表是遗留代码,并且您希望将其转换为没有内存开销的散列映射,则还可以通过重复弹出列表中的元素并将其转换为哈希映射来逐元素地执行此操作.


Eth*_*ang 5

使用lodash 4.12.0,您可以使用_.differenceBy.

_.differenceBy(a, b, 'id');
Run Code Online (Sandbox Code Playgroud)

  • 由于原始答案没有lodash的概念,因此您的答案没有提供解决此问题的任何信息。这就像问“我如何种一棵苹果树?” 得到答案“您可以在商店中购买苹果”。 (3认同)