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-是的,如果对象有多个属性,这不是一个可靠的解决方案。此尝试来自?已关闭以获取答案的问题。此尝试来自?已关闭等待回答的问题。