javascript - 数组对比差异
PHP中文网
PHP中文网 2017-04-11 10:58:47
[JavaScript讨论组]

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

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

认证0级讲师

全部回复(6)
ringa_lee

比较初级的哈哈,

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(','));
黄舟

空间足够的话,做个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]);
    }
}
高洛峰

也就循环了吧?

大家讲道理

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

如果是生产环境下,我会引入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中已经相等的元素,这里就不写了。

伊谢尔伦

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

怪我咯

采用es6的Set结构

var set = new Set(arr2);
arr1.filter(v=>!set.has(v));
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号