首页 > 数组对比差异

数组对比差异

如何快速地对比出这两个数组中不是同时存在的元素。
目测答案是:"574a97fe2b51e90056e423c0"

var arr1 = [
    "574417bc79df540065d92df7",
    "574424e5df0eea0063adefc6",
    "57442329a3413100625f194f",
    "5744242bc4c971005d5ff04e",
    "574a841d1532bc006068c6c9",
    "574a97fe2b51e90056e423c0"
];
var arr2 = [
    "574417bc79df540065d92df7",
    "57442329a3413100625f194f",
    "5744242bc4c971005d5ff04e",
    "574424e5df0eea0063adefc6",
    "574a841d1532bc006068c6c9"
];

异或操作,对应的位相同为0,不同为1?


空间足够的话,做个hash表映射一下喽:

const ans = [], temp = {};
for(let i = 0; i < arr1.length; i++) {
    temp[arr1[i]] = true;
}
for(let i = 0; i < arr2.length; i++) {
    if(!temp.hasOwnProperty(arr2[i])) {
        ans.push(arr2[i]);
    }
}

比较初级的哈哈,

var lessArr,maxArr;
if(arr1.length>arr2.length) {
    lessArr = arr2; 
    maxArr = arr1; 
}else{
    lessArr = arr1; 
    maxArr = arr2; 
}
var lessStr = lessArr.join('|');
var diffArr = [];
for(var i=0;i<maxArr.length;i++) {
    if(lessStr.indexOf(maxArr[i]) == -1) {
        diffArr.push(maxArr[i]);
    }
}
console.log(diffArr.join(','));

采用es6的Set结构

var set = new Set(arr2);
arr1.filter(v=>!set.has(v));

也就循环了吧?


其实题主的问题应该是问如何找出两个数组之间的差集。

如果是生产环境下,我会引入lodash这个工具库(如果是java的话引入guava库),然后用以下代码实现该需求:
var arr1 = [1,2,3];
var arr2 = [1,4,5];

_.difference(arr1, arr2);    //返回存在于arr1中,而不存在于arr2中的元素集合
// return [2,3]

_.xor(arr1, arr2);    //返回arr1和arr2中除共同元素外的所有元素集合
// return [2,3,4,5]

看了一下lodash里面difference的实现,核心内容大概就是arr1正向遍历,arr2逆向遍历,我试着写了一下:

function difference1(arr1, arr2) {
    var result = [];
    for(var i = 0, length = arr1.length; i < length;i++) {
        var value = arr1[i];
        for(var j = arr2.length - 1;j >= 0; j--) {
            if (value === arr2[j]) {
                j = NaN;
                break;
            }
        }
        if (!isNaN(j) && result.indexOf(value) === -1) {
            result.push(value);        
        }
    }
    return result;
}
// 并不能确定difference1和difference2的性能是否相等
function difference2(arr1, arr2) {
    var result = [];
    for(var i = 0, length = arr1.length; i < length; i++) {
        var value = arr1[i];
        if (arr2.indexOf(value) === -1) {
            result.push(value);
        }
    }
    return result;
}

当然,这段代码还有很多可以优化的地方,例如剔除arr2中已经相等的元素,这里就不写了。

【热门文章】
【热门文章】