检查数组中是否已存在对象?

时间:2015-07-16 11:57:52

标签: javascript arrays

我正在使用大量数据,对于这个问题,我会写一些类似的东西,避免所有的键/值。

有一个对象数组:

[
  { id: 0, name: 'Tom', age: '18' },
  { id: 1, name: 'Rob', age: '22' },
  { id: 2, name: 'Carl', age: '19' },
  ...
]

有时,用户已添加已更新,并且通过SSE,我会收到该用户对象的回复。

我需要检查用户是否已经在id进行数组检查。因为如果添加了用户,我需要做一些操作,但如果它刚刚更新,我需要做一些其他操作......

基本上我需要的是:如果user.id在array.user中做某事,否则做其他事情......

到目前为止,我尝试过的是for循环,但我认为这不是一个好主意,或者我使用它很糟糕。

6 个答案:

答案 0 :(得分:1)

使用Array.prototype.filter

您可以使用Array.prototype.filter中提到的this other question

Undefined offset: 15
 /home/importer/vendor/phpoffice/phpexcel/Classes/PHPExcel/Reader/Excel5.php:3554
 /home/importer/vendor/phpoffice/phpexcel/Classes/PHPExcel/Reader/Excel5.php:814
 /home/importer/vendor/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php:192

但是,即使从一开始就找到了这个人,该方法也会遍历所有项目。

使用循环

为了避免这种情况,你可以使用一个好的旧循环:

var people = [
  { id: 0, name: 'Tom', age: '18' },
  { id: 1, name: 'Rob', age: '22' },
  { id: 2, name: 'Carl', age: '19' }
];

function personExists(id){
  return !!people.filter(function(person){
    return person.id == id;
  }).length;
}

document.body.innerHTML = personExists(2) // true
                        + '<br>'
                        + personExists(5); // false

使用Object属性名称作为ID

另一种方法可以提高性能,但需要将Array更改为对象:

var people = [
  { id: 0, name: 'Tom', age: '18' },
  { id: 1, name: 'Rob', age: '22' },
  { id: 2, name: 'Carl', age: '19' }
];

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

document.body.innerHTML = personExists(2) // true
                        + '<br>'
                        + personExists(5); // false

答案 1 :(得分:1)

let found = arr.some(key => key.id === key.id);
if (!found) console.log('not found')

答案 2 :(得分:0)

如果您不想使用for循环并且不支持旧浏览器(例如IE8),您可以使用Array.prototype.filter返回任何与之匹配的用户的数组你要搜索的userId,例如

users.filter(function(user) {
    return user.id === userId; 
});

然后你可以测试返回的数组是否为空。

答案 3 :(得分:0)

您可以使用lodash库include方法。

您还可以使用grep方法:

Select isnull(FirstName,'') + ' ' +isnull(MiddleName,'') + ' ' + isnull(LastName ,'')
As FullName from EmpName

如果对象存在,则 var new_array = $.grep(old_array, function(e) { return e.id == id_of_wanted_object; }); 大于零

答案 4 :(得分:0)

如果id是自动生成的并且不是遥远的数字,那么我宁愿使数组索引和id相同。例如,

id为8的对象应该在数组的索引8上。 id为10的对象应该在数组中的索引10上。

因此可以使用索引通过id拾取对象。但如果ID之间存在差距,则此解决方案将适应空间复杂性。

答案 5 :(得分:0)

要测试给定的ID是否在数组中,您可以使用Array.prototype.some

var haystack = {/* your object array */},
    // the id to search for:
    needle = 0,

// Array.prototype.some() returns a Boolean true/false
// which corresponds to:
//     true -  one of the object ids is equal to the needle,
//     false - none of the object ids are equal to the needle
idIsInArray = haystack.some(function (obj) {
    return obj.id === needle;
});

&#13;
&#13;
var haystack = [{
    id: 0,
    name: 'Tom',
    age: '18'
}, {
    id: 1,
    name: 'Rob',
    age: '22'
}, {
    id: 2,
    name: 'Carl',
    age: '19'
}],
    needle = 0,
    idIsInArray = haystack.some(function (obj) {
        return obj.id === needle;
    });

console.log(idIsInArray);
&#13;
&#13;
&#13;

但更有用的是,将检索对象的索引:

var haystack = [/* your array of objects */],
    needle = 2,

    // Array.prototype.map() retains returns a new array,
    // in this case if the obj.index is equal to the needle
    // it will contain the index of that object, all other
    // values will be undefined:
    needleOnly = haystack.map(function (obj, index) {
        if (obj.id === needle) {
            return index;
        }
    }),

// here we get the index of the needle from the needleOnly array
// we created, which has the same number of elements as the
// haystack array, but contains only the index points of those
// array-elements whose id was equal to the needle:
    needleAtIndex = needleOnly.indexOf(needle);

console.log(needleAtIndex, haystack[needleAtIndex]);

&#13;
&#13;
var haystack = [{
    id: 0,
    name: 'Tom',
    age: '18'
  }, {
    id: 1,
    name: 'Rob',
    age: '22'
  }, {
    id: 2,
    name: 'Carl',
    age: '19'
  }],
  needle = 2,
  needleOnly = haystack.map(function(obj, index) {
    if (obj.id === needle) {
      return index;
    }
  }),
  needleAtIndex = needleOnly.indexOf(needle);

console.log(needleAtIndex, haystack[needleAtIndex]);
&#13;
&#13;
&#13;

参考文献: