如何检查数组中是否存在某个对象?

时间:2018-02-07 19:57:41

标签: javascript arrays object ecmascript-5

我有一组像

这样的对象
[
  {
    "name": "Name 1",
    "id": "1245"
  },
  {
    "name": "Name 2",
    "id": "9788"
  },
  {
    "name": "Name 3",
    "id": "5694"
  },
  {
    "name": "Name 4",
    "id": "4523"
  },
  {
    "name": "Name 5",
    "id": "4567"
  }
]

我需要检查数组是否包含带ID的对象(比方说“1111”)。如果在数组内的任何对象中找不到ID,则将新对象(例如,{"name":"Test 0","id":"1111"})放在数组的开头。

PS:为实现目标,是否有除array.unshift(newObj)以外的方法?

编辑:好的。我确实尝试过使用array.indexOf(),但它似乎只适用于值而不是对象。我也尝试循环遍历数组,但也没有奏效。我不能使用ES6。

2 个答案:

答案 0 :(得分:0)

使用reduce

function hasId(array, id){
    return array.reduce(function(sum, element){
        return sum || element.id === id;
    }, false);
}

if(hasId(array, 1111)){
    array.splice(0, 0, newElement);  
}

有1000种方法可以做到这一点。这个解决方案适用于es5,它不是太有效,因为它贯穿整个阵列。最快的方法是在for循环中执行,然后在第一次找到时返回,但这看起来更漂亮。

使用for循环

function hasId(array, id){
   for(var i=0; i<array.length;i++){
       if(array[i].id === id){
           return true;
       }
   }
   return false;
}

if(hasId(array, 1111)){
    array.splice(0, 0, newElement);  
}

这是最快的方法,只要找到第一个ID就会停止

答案 1 :(得分:0)

如果没有ES6并且假设您的对象名为users,则可以有条件地添加一个如果它不存在,如下:

function addUser(name, id) {

    users.forEach(function(user) {
        if (user.id === id) {
            return user;
        }
    });

    var newUser = {"name": name,"id": id}

    users.unshift(newUser);

    return newUser;

}