问题描述
我正在使用庞大的数据数组,对于这个问题,我将写类似的东西来避免所有键/值。
有一个对象数组:
[
{ 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循环,但是我认为这不是一个好主意,或者我使用得不好。
1楼
使用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
2楼
如果您不想使用for
循环并且不支持旧版本的浏览器(例如IE8),则可以使用Array.prototype.filter
返回一个数组,该数组包含与您要搜索的userId匹配的所有用户,例如
users.filter(function(user) {
return user.id === userId;
});
然后,您可以测试返回的数组是否为空。
3楼
您可以使用lodash库( 方法)。
您也可以使用方法:
var new_array = $.grep(old_array, function(e) {
return e.id == id_of_wanted_object;
});
如果对象存在,则length
将大于零
4楼
如果id是自动生成的并且不是遥不可及的数字,那么我希望将数组索引和id设置为相同。 例如,
id为8的对象应在数组的索引8上。 id为10的对象应在数组的索引10上。
因此,可以使用索引通过id拾取Object。 但是,如果id之间存在间隙,则此解决方案将因空间复杂性而适得其反。
5楼
要测试给定的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]);
参考文献:
- 。
- 。
- 。
6楼
let found = arr.some(key => key.id === key.id);
if (!found) console.log('not found')