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

3
需要将数组对象(arr1)的值推送到另一个数组对象(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


看看这个链接,LiraNuna的答案会对你有帮助。 - pkovzz
你的函数 add 应该做什么? - Nina Scholz
你在谈论将值推入arr2,但是你的代码却相反(或者说有点尝试)。鉴于你的add()函数似乎以字符串作为输入,那么如果该值当前既不在数组中会发生什么(a),如果它当前只在arr1中(b),如果它当前只在arr2中(c),如果它已经在两个数组中(d)? - nnnnnn
5个回答

6

如果arr1中已经存在name属性,您可以使用哈希表进行查找。如果不存在,则将实际项推入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
如果您有使用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 来简化操作。此外,为了节省一些循环,


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);

Will display:

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

1

嗨,看一下这个。你可以将第一个数组推到另一个数组中,然后使用underscore unique函数来仅返回唯一的对象。

   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;
});

那么对于不知道Underscore是什么的JS初学者呢?(另外,您正在将整个arr2数组作为arr1的单个元素推送-我知道OP的代码是这样做的,但我认为这不是他们想要的。) - nnnnnn
你又开始了@nnnnnn。 - Gayathri Mohan

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接