如何找到与两个数组相交的所有OBJECTS?

时间:2014-02-13 05:58:13

标签: javascript arrays

如果我有两个对象数组,如下所示:

var a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}], 
    a2 = [{"g":"h"}, {"a":"b"}, {"i":"j"}]

(请注意,对象可以是任何结构,而不是那么简单)

提取两个数组中所有对象的最有效方法是什么?

我查了这个问题:Finding matches between multiple JavaScript Arrays,但这不一样......

3 个答案:

答案 0 :(得分:1)

  

提取两个数组中的所有对象?

基本上您只需将Simplest code for array intersection in javascriptObject 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"}