我正在使用大量数据,对于这个问题,我会写一些类似的东西,避免所有的键/值。
有一个对象数组:
[
{ 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循环,但我认为这不是一个好主意,或者我使用它很糟糕。
答案 0 :(得分:1)
您可以使用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
另一种方法可以提高性能,但需要将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;
});
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;
但更有用的是,将检索对象的索引:
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]);
&#13;
参考文献: