数组对象如何根据属性值判断是否存在在另一个数组内?

有如下两个数组:

var arr1 = [
    {
        name:"牛",
        id:1
    },
    {
        name:'羊',
        id:2
    }
],
arr2 = [
    {
        name:'羊',
        id:2
    },
    {
        name:'牛蛙',
        id:3
    },
    {
        name:'螃蟹',
        id:4
    }
];

arr2.push(arr1)之前,需要判断arr2内是否已经存在arr1内的元素(通过id判断),如果已经存在,则不添加,否则就push。有没有什么好的精简的方法?

阅读 3.8k
3 个回答

这个问题本质上就是求几个数组的交集,再怎么精简都一定要先遍历这些数组去获取id值相同的元素,最简单的方法是自己封装一个函数,或者用lodashramda之类的工具库:

function intersection() {
    var key = Array.prototype.pop.call(arguments);
    var ret = Array.prototype.shift.call(arguments);
    for (var i = 0; i < arguments.length; ++i) {
        var temp = [];
        filter: for (var j = 0; j < ret.length; ++j) {
            for (var k = 0; k < arguments[i].length; ++k) {
                if (ret[j][key] === arguments[i][k][key]) {
                    temp.push(ret[j]);
                    continue filter;
                }
            }
        }
        ret = temp;
    }
    return ret;
}
var arr = intersection(arr1, arr2, "id");  // 得到数组arr1和arr2的交集
arr.length || arr2.push(arr1);             // 没有交集则把arr1添加到arr2中
console.dir(arr2);
if(!arr2.find(item => item.id === target.id)){
    arr2.push(target)
}

这就是个取交集或者说创建唯一值数组的问题。用lodashintersectiondifferenceuniq等方法都可以做到。如果你想知道怎么实现的,直接去看源码就好了: lodash

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题