【问题标题】:How to find all OBJECTS that intersect two arrays?如何找到与两个数组相交的所有对象?
【发布时间】:2014-02-13 05:58:13
【问题描述】:

如果我有两个对象数组,像这样:

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

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

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

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

【问题讨论】:

  • 这非常简单,因为这些对象都不在两个数组中...
  • 你能解释一下吗,我没看懂……比如{"a":"b"}在两个数组中……
  • 这些是碰巧具有相同属性名称和值的不同对象。 a1[0] === a2[1]false。因此,如果两个对象具有相同的属性和值,您似乎认为它们是相等的,对吗?
  • 在 js 中,所有的对象字面量都是不同的实体。即使它们具有相同的属性和值,它们也是不同的对象和 o1!=o2...
  • 当然,我的意思是“相同的属性和值”,而不是相同的对象

标签: javascript arrays


【解决方案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 函数。

什么是最有效的方法?

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

【讨论】:

    【解决方案2】:

    要仅查找第一个重复对象并中断程序,您可以使用组合 .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"}
    

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • @techfoobar:你对性能有什么看法?您建议此代码处理的最大数组长度是多少?
    • 大对象可能需要更多时间进行字符串化和比较。如果您的数组或其中的对象太大,那么也许这不是要走的路,因为在上面的代码中发生了很多字符串化、字符串对象的创建和比较。
    • 请注意,JSON.stringify 不一定要保留任何属性顺序,因此 JSON.stringify({a:1,b:2}) == JSON.stringify({b:2,a:1}) 可以工作,也可以不工作。
    • @Bergi - 是的,如果对象具有多个属性,这不是一个可靠的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多