Javascript 如何查找与两个阵列相交的所有对象?

Javascript 如何查找与两个阵列相交的所有对象?,javascript,arrays,Javascript,Arrays,如果我有两个对象数组,如下所示: var a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}], a2 = [{"g":"h"}, {"a":"b"}, {"i":"j"}] (请注意,对象可以是任何结构,而不是如此简单) 提取两个数组中的所有对象的最有效方法是什么 我检查了这个问题:,但这不一样…您可以使用JSON.stringify()展平对象,然后检查交叉点 var a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}],

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

var a1 = [{"a":"b"}, {"b":"c"}, {"d":"e"}], 
    a2 = [{"g":"h"}, {"a":"b"}, {"i":"j"}]
(请注意,对象可以是任何结构,而不是如此简单)

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

我检查了这个问题:,但这不一样…

您可以使用
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;
});
相交
将包含对象
{“a”:“b”}

您可以使用
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;
});
相交
将包含对象
{“a”:“b”}

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

基本上,您只需与(而不是使用identity
=
操作符)组合即可:

使用任何最适合您需求的
对象.equals
函数

最有效的方法是什么

这取决于你的物品。如果您可以在它们上定义一个合理的比较函数,以便对数组进行排序,或者如果您甚至可以提出一个一致的哈希函数,那么有比上述更快的方法。检查链接问题中的答案

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

基本上,您只需与(而不是使用identity
=
操作符)组合即可:

使用任何最适合您需求的
对象.equals
函数

最有效的方法是什么


这取决于你的物品。如果您可以在它们上定义一个合理的比较函数,以便对数组进行排序,或者如果您甚至可以提出一个一致的哈希函数,那么有比上述更快的方法。检查链接问题中的答案。

要仅查找第一个重复对象并中断此过程,您可以使用组合
。查找方法:

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

要仅查找第一个重复对象并中断此过程,您可以使用组合
。查找方法:

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

这非常简单,因为这些对象都不在两个数组中…你能解释一下吗,我不明白。。。例如,
{“a”:“b”}
位于两个数组中……这些是不同的对象,恰好具有相同的属性名称和值
a1[0]==a2[1]
false
。因此,如果两个对象具有相同的属性和值,那么您似乎认为它们是相等的,对吗?在js中,所有对象文字都是不同的实体。即使它们具有相同的属性和值,它们也是不同的对象和o1=o2…当然,我的意思是“相同的属性和值”,而不是相同的对象这非常容易,因为这些对象都不在两个数组中…你能解释一下吗,我不明白。。。例如,
{“a”:“b”}
位于两个数组中……这些是不同的对象,恰好具有相同的属性名称和值
a1[0]==a2[1]
false
。因此,如果两个对象具有相同的属性和值,那么您似乎认为它们是相等的,对吗?在js中,所有对象文字都是不同的实体。即使它们具有相同的属性和值,它们也是不同的对象和o1=o2…当然,我的意思是“相同的属性和值”,而不是相同的objects@techfoobar:关于性能,你能说些什么?您建议此代码处理的最大数组长度是多少?大型对象可能需要更多时间进行字符串化和比较。如果您的数组或其中的对象太大,那么这可能不是一种方法,因为上面的代码中有很多字符串化、字符串对象创建和比较。请注意,
JSON.stringify
不一定要保留任何属性顺序,因此
JSON.stringify({a:1,b:2})=JSON.stringify({b:2,a:1})
可能有效,也可能无效。@Bergi-是的,如果对象有多个属性,这不是一个可靠的解决方案。@techfoobar:关于性能,你能说些什么?您建议此代码处理的最大数组长度是多少?大型对象可能需要更多时间进行字符串化和比较。如果您的数组或其中的对象太大,那么这可能不是一种方法,因为上面的代码中有很多字符串化、字符串对象创建和比较。请注意,
JSON.stringify
不一定要保留任何属性顺序,因此
JSON.stringify({a:1,b:2})=JSON.stringify({b:2,a:1})
可能有效,也可能无效。@Bergi-是的,如果对象有多个属性,这不是一个可靠的解决方案。此尝试来自?已关闭以获取答案的问题。此尝试来自?已关闭等待回答的问题。