如果值不存在,则将数组对象推送到另一个数组对象

时间:2016-06-28 06:19:07

标签: javascript arrays object

如果值不存在,需要将数组对象(arr1)valeus推送到另一个数组对象(arr2)。现有值不会推入另一个数组。

var arr1 = [{
    name: 'fred'
}, {
    name: 'bill'
}, {
    name: 'ted'
}, {
    name: 'james'
}];

var arr2 = [{
    name: 'spil'
}, {
    name: 'fred'
}, {
    name: 'bill'
},{
    name: 'paul'
}, {
    name: 'stone'
}];

function add(name) {
    var found = arr1.some(function (el) {
      return el.name === name;
    });
    if (!found) {
        arr1.push(arr2);
    }
    return arr2;
}

Fiddle

5 个答案:

答案 0 :(得分:2)

如果name属性已经在arr1中,您可以使用哈希表进行查找。如果没有将实际项目推送到arr1

var arr1 = [{ name: 'fred' }, { name: 'bill' }, { name: 'ted' }, { name: 'james' }],
    arr2 = [{ name: 'toString' }, { name: 'spil' }, { name: 'fred' }, { name: 'bill' }, { name: 'paul' }, { name: 'stone' }],
    hash = Object.create(null);

arr1.forEach(function (a) {
    hash[a.name] = true;
});
arr2.forEach(function (a) {
    hash[a.name] || arr1.push(a);
});

console.log(arr1);

PS

为了弄清楚,为什么Object.create(null),一个真正空的对象作为哈希,而不是{},一个空对象。请注意项{ name: 'toString' }。在第一部分中,项目将被插入,而第二部分则不会,因为hash具有名称为toString的属性。

var arr1 = [{ name: 'fred' }, { name: 'bill' }, { name: 'ted' }, { name: 'james' }],
    arr2 = [{ name: 'toString' }, { name: 'spil' }, { name: 'fred' }, { name: 'bill' }, { name: 'paul' }, { name: 'stone' }],
    hash = {}; // now an object

arr1.forEach(function (a) {
    hash[a.name] = true;
});
arr2.forEach(function (a) {
    hash[a.name] || arr1.push(a);
});

console.log(arr1);

答案 1 :(得分:1)

如果你只附加一个变量,那么push()就可以了。如果需要追加另一个数组,请使用concat():     var ar1 = [1,2,3];     var ar2 = [4,5,6];

var ar3 = ar1.concat(ar2);

alert(ar1);
alert(ar2);
alert(ar3);

吐出来:

"1,2,3"
"4,5,6"
"1,2,3,4,5,6"

除非重新分配,否则concat不会影响ar1和ar2,例如:

ar1 = ar1.concat(ar2);
alert(ar1);

将显示:

"1,2,3,4,5,6"

答案 2 :(得分:1)

使用indexOf获取不存在的名称。首先将您的arr1名称存储为数组!!!

var hasName = arr1.map(function(obj) { return obj.name; });
arr2.filter(function(v,i) { if(hasName.indexOf(v.name) == -1) arr1.push(v); });      
console.log(arr1);

答案 3 :(得分:1)

如果您有使用ECMAScript 6的奢侈品,那么您可以创建这个可爱的块



var arr1 = [{
    name: 'fred'
}, {
    name: 'bill'
}, {
    name: 'ted'
}, {
    name: 'james'
}];

var arr2 = [{
    name: 'spil'
}, {
    name: 'fred'
}, {
    name: 'bill'
},{
    name: 'paul'
}, {
    name: 'stone'
}];

arr2.forEach(arr2Item => arr1.find(({ name }) => name === arr2Item.name) || arr1.push(arr2Item));

console.log(arr1);




鉴于有大量递归,您可能希望以不同的格式存储数据,以便您可以更轻松地进行比较。您可以使用对象哈希或ES6 Map来简化您的生活。还节省了几个周期

答案 4 :(得分:0)

嗨检查这个你可以将第一个数组推送到其他数组以后可以使用下划线唯一来返回唯一对象

   var arr1 = [{
    name: 'fred'
}, {
    name: 'bill'
}, {
    name: 'ted'
}, {
    name: 'james'
}];

var arr2 = [{
    name: 'spil'
}, {
    name: 'fred'
}, {
    name: 'bill'
}, {
    name: 'paul'
}, {
    name: 'stone'
}];

arr1.push(arr2);
arr1 = _.uniq(arr1, false, function(p) {
    return p.name;
});