检查一个数组中的元素是否存在于另一个数组中

时间:2018-11-24 17:18:51

标签: javascript arrays dictionary

使用JavaScript检查一个数组中的元素是否存在于另一数组中的最佳方法是什么?

我想出了以下两种方法(但我都不喜欢)。

方法1

for(let i = 0; i < arr1.length; ++i) {
    for(let j = 0; j < arr2.length; ++j) {
        if(arr1[i] === arr2[j]) {
            arr1[i].isPresentInArr2 = true;
            break;
        }
    }
}

方法2

const idToObj = {};
for(let i = 0; i < arr2.length; ++i) {
    nameToObj[arr2[i].Id] = arr2[i];
}
for(let i = 0; i < arr1.length; ++i) {
    if(nameToObj[arr1[i].Id]) {
        nameToObj[arr1[i].Id].isPresentInArr2 = true;
    }
}

在这里,我假设我有两个对象数组:arr1arr2。这些对象每个都有一个唯一的Id属性。我要检查arr1中是否存在arr2中的每个对象。

我想第二种方法会更有效。希望有有趣的建议。

4 个答案:

答案 0 :(得分:0)

就算法复杂度而言,这就像权衡取舍。 第一个-时空复杂度-0,运行时复杂度-0(n2)

第二个-时空复杂度-o(n),运行时复杂度-0(n)

如果它以性能为重点,那就去第二个。

就js方式而言,您有很多方式。阅读javascript中的include()和indexOf()内置方法,以避免编写循环。还可以利用javascript map功能。您还可以使用underscore.js

参考Check if an array contains any element of another array in JavaScript了解更多详细信息。

答案 1 :(得分:0)

您可以获取ID列表,然后对ID进行排序,并使用JSON.stringify

比较ID的两个数组列表

// Test arrays to work with
const array1 = [{Id:10},{Id:11},{Id:13},{Id:12}]
const array2 = [{Id:10},{Id:11},{Id:12},{Id:13}]
const array3 = [{Id:10},{Id:11},{Id:12}]

function test(arr1, arr2) {
  // Map of each array [0, 1, 2, etc...]
  let map1 = arr1.map(i => i.Id)
  let map2 = arr2.map(i => i.Id)

  // Sort each array from lowest to highest
  // Note: Some kind of sort is required if we are going to compare JSON values
  map1.sort()
  map2.sort()

  // Test the mapped arrays against each other
  return JSON.stringify(map1) === JSON.stringify(map2)
}

console.log(test(array1, array2))
console.log(test(array1, array3))

答案 2 :(得分:0)

您可以对数组进行排序,然后检查它们是否彼此相等:

var array1 = [4, 304, 2032], // Some random array
  array2 = [4, 2032, 304];

function areEqual(array1, array2) {
  if (array1.sort().toString() == array2.sort().toString()) {
    // They're equal!
    document.getElementById("isEqual").innerHTML = ("Arrays are equal");
    return true;
  } else {
    // They're not equal.
    document.getElementById("isEqual").innerHTML = ("Arrays aren't equal");
    return false;
  }
}
areEqual(array1, array2);
<!DOCTYPE html>
<html>

<body>
  <p id="isEqual"></p>
</body>

</html>

答案 3 :(得分:0)

map在对象数组上生成ID数组,然后使用everyincludes将一个数组中的元素与另一个数组中的元素进行比较:{{1} }。

这是一个可行的示例:

> predict (NB_TRAIN_model[[1]],test[1,2:6],type = "class")