2014-02-13 44 views
0

如果我有对象的两个数组,像这样:如何查找所有与两个数组相交的对象?

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

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

什么是最有效的方式来提取的所有对象在两个阵列中?

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

+2

它的超级容易,因为没有这些对象是在两个数组... – dandavis

+0

你能解释一下,我不明白...例如'{“a”:“b”}'在两个数组中...... –

+1

这些是不同的对象,它们碰巧具有相同的属性名称和值。 'a1 [0] === a2 [1]'是'false'。那么,如果你认为两个物体相同,如果它们具有相同的属性和值,那么看起来是正确的? –

回答

-1

使用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"}

+0

聪明聪明...很酷的答案... – ncubica

+0

@techfoobar:你能说什么关于表现?什么是你推荐这个代码处理的最大数组长度? –

+0

大型物体可能需要更多时间进行串化和比较。如果你的数组或其中的对象太大,那么可能这不是一条路,因为在上面的代码中有很多字符串化,字符串对象的创建和比较。 – techfoobar

2

提取所有处于两个阵列的对象?

基本上你只需要结合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

只查找第一个重复对象并打破过程中,您可以使用组合.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"} 
+0

这个尝试来自[如何比较两个数组相同的对象](https://stackoverflow.com/questions/46770250/how-to-compare-two-arrays-for-identical-objects)?问题是关闭的答案。 – dhilt

相关问题