如果我有两个对象数组,如下所示:
var a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}],
a2 = [{"g":"h"}, {"a":"b"}, {"i":"j"}]
(请注意,对象可以是任何结构,而不是那么简单)
提取两个数组中所有对象的最有效方法是什么?
我查了这个问题:Finding matches between multiple JavaScript Arrays,但这不一样......
答案 0 :(得分:1)
提取两个数组中的所有对象?
基本上您只需将Simplest code for array intersection in javascript与Object comparison in JavaScript结合使用(而不是使用标识==
运算符):
var intersection = a1.filter(function(a) {
return a2.some(function(b) {
return Object.equals(a, b);
});
});
使用最符合您要求的任何Object.equals
功能。
最有效的方法是什么?
这取决于你的对象。如果你可以在它们上定义一个合理的比较函数,以便你可以对数组进行排序,或者你甚至可以提出一致的散列函数,那么有比上面更快的方法。检查链接问题中的答案。
答案 1 :(得分:1)
要仅查找第一个重复对象并中断该过程,您可以使用组合.find
方法:
const a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}], a2 = [{"g":"h"}, {"a":"b"}, {"i":"j"}]
const compareObjects = (o1, o2) => JSON.stringify(o1) === JSON.stringify(o2);
const findFirst = (a1, a2) => a1.find(i1 => a2.find(i2 => compareObjects(i1, i2)));
console.log(findFirst(a2, a1)); // {a: "b"}
答案 2 :(得分:0)
您可以使用JSON.stringify()
展平对象,然后检查交叉点。
var a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}],
a2 = [{"g":"h"}, {"a":"b"}, {"i":"j"}]
// flatten objects in second array
var stringifiedA2 = a2.map(function(x) {
return JSON.stringify(x);
});
// get intersecting objects
var intersecting = a1.filter(function(x) {
return stringifiedA2.indexOf(JSON.stringify(x)) !== -1;
});
intersecting
将包含对象{"a": "b"}