使用javascript将唯一对象插入到对象数组中?

时间:2018-01-16 17:26:52

标签: javascript arrays javascript-objects

我正在对一组对象执行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"}];

如何仅将唯一对象推送到数组?

3 个答案:

答案 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