[英]Quickest way to check if 2 arrays contain same values in javascript
是否有更快或更有效的方法来检查两个 arrays 在 javascript 中是否包含相同的值?
这是我目前正在做的检查。 它有效,但很长。
var arraysAreDifferent = false;
for (var i = 0; i < array1.length; i++) {
if (!array2.includes(array1[i])) {
arraysAreDifferent = true;
}
}
for (var i = 0; i < array2.length; i++) {
if (!array1.includes(array2[i])) {
arraysAreDifferent = true;
}
}
要将计算复杂度从O(n ^ 2)
降低到O(n)
,请改用 Sets - Set.has
是O(1)
,但Array.includes
是O(n)
。
使用.every
来检查数组中的每个项目是否都通过了测试,而不是常规for
循环的冗长手动迭代。 还要检查两个 Set 的大小是否相同 - 如果这样做了,那么如果 arrays 之一被迭代,则不需要迭代另一个(除了构建其 Set):
const arr1Set = new Set(array1);
const arr2Set = new Set(array2);
const arraysAreDifferent = (
arr1Set.size === arr2Set.size &&
array1.every(item => arr2Set.has(item))
);
function same(arr1, arr2){
//----if you want to check by length as well
// if(arr1.length != arr2.length){
// return false;
// }
// creating an object with key => arr1 value and value => number of time that value repeat;
let frequencyCounter1 = {};
let frequencyCounter2 = {};
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
}
for(let key in frequencyCounter1){
//check if the key is present in arr2 or not
if(!(key in frequencyCounter2)) return false;
//check the number of times the value repetiton is same or not;
if(frequencyCounter2[key]!==frequencyCounter1[key]) return false;
}
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.