当前位置: 代码迷 >> JavaScript >> 检查数组中是否已存在对象?
  详细解决方案

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

热度:13   发布时间:2023-06-08 09:20:21.0

我正在使用庞大的数据数组,对于这个问题,我将写类似的东西来避免所有键/值。

有一个对象数组:

[
  { 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循环,但是我认为这不是一个好主意,或者我使用得不好。

使用Array.prototype.filter

您可以使用 ,如 。

 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 

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

使用循环

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

 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 

使用对象属性名称作为ID

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

 var people = { '0' : { name: 'Tom', age: '18' }, '1' : { name: 'Rob', age: '22' }, '2' : { name: 'Carl', age: '19' } }; function personExists(id){ return people.hasOwnProperty(id); } document.body.innerHTML = personExists(2) // true + '<br>' + personExists(5); // false 

如果您不想使用for循环并且不支持旧版本的浏览器(例如IE8),则可以使用Array.prototype.filter返回一个数组,该数组包含与您要搜索的userId匹配的所有用户,例如

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

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

您可以使用lodash库( 方法)。

您也可以使用方法:

 var new_array = $.grep(old_array, function(e) {
        return e.id == id_of_wanted_object;
    });

如果对象存在,则length将大于零

如果id是自动生成的并且不是遥不可及的数字,那么我希望将数组索引和id设置为相同。 例如,

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

因此,可以使用索引通过id拾取Object。 但是,如果id之间存在间隙,则此解决方案将因空间复杂性而适得其反。

要测试给定的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;
});

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

不过,更有用的是检索对象的索引:

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

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

参考文献:

let found = arr.some(key => key.id === key.id);
if (!found) console.log('not found')
  相关解决方案