使用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;
}
}
在这里,我假设我有两个对象数组:arr1
和arr2
。这些对象每个都有一个唯一的Id
属性。我要检查arr1
中是否存在arr2
中的每个对象。
我想第二种方法会更有效。希望有有趣的建议。
答案 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
// 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)