我正在对一组对象执行push操作。 我的代码看起来类似如下所示,
var obj = {"id":1, "fname":"john", "lname":"doe"};
var userArray = [{
"id": 1,
"fname": "john",
"lname": "doe"
}, {
"id": 2,
"fname": "john",
"lname": "doe"
}];
userArray.forEach(function (element) {
if(element.id !== obj.id) {
userArray.push(obj);
}
});
console.log(userArray);
当我在userArray上执行push操作时,它已经包含了我正在推送的对象(从代码var obj = {"id":1, "fname":"john", "lname":"doe"};
开始),它会在第二次传递for for循环时将其推送到数组。
预期输出应为userArray = [{"id": 1,"fname": "john","lname": "doe"}, {"id": 2, "fname": "john","lname": "doe"}];
但我得到了userArray = [{"id": 1,"fname": "john","lname": "doe"}, {"id": 2, "fname": "john","lname": "doe"}, {"id": 1,"fname": "john","lname": "doe"}];
如何仅将唯一对象推送到数组?
答案 0 :(得分:3)
使用数组.some
方法检查列表中是否已存在具有该ID的项目。如果没有,那么推入阵列:
var obj = {"id":1, "fname":"john", "lname":"doe"};
var userArray = [{
"id": 1,
"fname": "john",
"lname": "doe"
}, {
"id": 2,
"fname": "john",
"lname": "doe"
}];
var existing = userArray.some(element => element.id === obj.id);
if(!existing) {
userArray.push(obj);
}
console.log(userArray);
答案 1 :(得分:1)
您需要搜索具有相同ID的用户,如果该用户不存在,则可以添加该用户。您需要首先遍历整个数组以检查所有元素。
var obj = {"id":3, "fname":"john", "lname":"doe"};
var userArray = [{
"id": 1,
"fname": "john",
"lname": "doe"
}, {
"id": 2,
"fname": "john",
"lname": "doe"
}];
/*Search for an user with the same id*/
var found = userArray.find(function(user) {
return user.id == obj.id;
});
/*Add the user if not found*/
if(!found){
userArray.push(obj);
}
答案 2 :(得分:1)
我看到两种可能的解决方案:
1)检查null
是否不存在。
id
此代码(或任何改进的基于循环的版本)每次都会迭代数组,这就是我更喜欢第二种选择的原因。
2)使var exists = false;
userArray.forEach(function (element) { // n/2 checks on average
if(element.id == obj.id) { // (this specific awful code, always n checks)
exists = true;
}
});
if (!exists) {
userArray.push(obj);
}
为userArray
作为索引的对象。
id