【问题标题】:Javascript, how to match and get similar objects containing in two arrays?Javascript,如何匹配并获取包含在两个数组中的相似对象?
【发布时间】:2015-03-17 14:30:15
【问题描述】:

我有两个对象数组。我想按名称检查数组 2 中存在的数组 1 中的对象列表。

arr1 = [{name: "krishna", age: 27}, {name: "chandan", age 30}]
arr2 = [{name: "krishna", age: 27}, {name: "chandan", age 30}, {name: "someone", age: 30}]

arr1 intersec arr2 = [{name: "krishna", age: 27}, {name: "chandan", age 30}]

首先我尝试遍历数组并按名称找到类似的对象,如下所示

var intersec = [];
for(var i = 0; i < arr1.length; i++) {
  for(var j = 0; j < arr2.length; j++) {
    if(arr1[i].name === arr2[j].name) {
      intersec.push(arr1[i]);
    }
  }
}

后来我认为如果数据量增加,这段代码会变得复杂。

所以我想出了另一个逻辑,我将 arr1 字符串化并迭代 arr2 并获取名称并在字符串化后的 arr1 上使用 indexOf 函数来检查它是否存在。

var exp = "name: \""+arr2[i].name+"\"";
stringArr1.indexOf(exp);

我想知道哪一个是有效的,还有其他有效的方法吗?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您在谈论效率时是正确的,因为您有两个“嵌套”循环,所以上面的复杂度是 O(n^2) 级别。您只想在每个循环中运行一次。

    首先,我将遍历第二个数组并创建一个对象,以便您可以轻松地按名称搜索:

    var obj2 = {};
    for (var i = 0; i < arr2.length; i++) {
        obj2[arr2[i].name] = arr2[i];
    }
    

    然后,遍历第一个数组,查看我们创建的新 obj2 对象中是否存在 name 属性:

    var intersec = [];
    for (var i = 0; i < arr1.length; i++) {
        if (obj2[arr1[i].name]) {
            intersec.push(arr1[i]);
        }
    }
    

    此解决方案将为您提供 O(2n) 级别的复杂性...效率更高!

    【讨论】:

    • 据我所知,当我们询问obj2[arr1[i].name] 时,javascript 引擎也会对obj2 中的键进行迭代并返回值。所以我想我正在迭代 (arr2.length + (arr1.length * obj2_key_size)) 次。这又是复杂的。我说的对吗?
    • 这是正确的答案 :) 可能的小改进:检查哪个数组的大小更小并将其放入哈希映射(您的 obj2)然后迭代更长的数组,因为构建哈希映射通常较慢。在某些情况下,一旦intersec 达到较小数组的大小,也可能会停止。
    • @KrishnaChaitanya:不正确。 obj2["key"] 是一个哈希映射访问操作。它需要从“key”中构建一个散列(整数)并访问位置hash("key") % mapSize 的数组槽,然后如果存在冲突,可能会迭代几个元素。所以它非常快,访问时间几乎恒定。
    • 很好,有几件事我在那里不知道。谢谢@AlexPakka。
    • @AlexPakka 感谢您的解释。接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2018-10-15
    • 2022-10-05
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多