[英]Check if object key exists within object
我正在尝试从现有对象中获取一些数据并将其分组到一个新对象中。 我遇到的问题是检查对象键是否存在,以便我可以创建一个新键,或将数据附加到现有键。
我发现了一些类似的问题,但没有一个答案有效,所以我有点卡住了。 它总是最终发现它不存在并创建重复的键。
我有以下代码,其中xxx
是我需要检查密钥是否存在的地方:
var groups = [];
for (var i=0; i<something.length; i++) {
var group_key = 'group_'+something[i].group_id;
if (xxx) {
// New group
var group_details = {};
group_details[group_key] = {
group_name: something[i].group_name,
items: [
{ 'name': something[i].name }
]
};
groups.push(group_details);
} else {
// Existing group
groups[group_key].items.push({
'name': something[i].name
});
}
}
我传递的something
非常简单,基本上是以下形式:
[
{
group_id: 3,
group_name: 'Group 3',
name: 'Cat'
},
{
group_id: 3,
group_name: 'Group 3',
name: 'Horse'
},
{
group_id: 5,
group_name: 'Group 5',
name: 'Orange'
}
]
实现这一点的最佳方法是依赖于in
运算符返回一个布尔值这一事实,该值指示该键是否存在于对象中。
var o = {k: 0};
console.log('k' in o); //true
但这不是您唯一的问题,您没有任何查找对象可以让您检查密钥是否已经存在。 不要使用数组,而是使用普通对象。
var groups = {};
然后,而不是groups.push(...)
,做groups[group_key] = group_details;
然后你可以通过执行if (group_key in groups) {}
来检查组是否存在
我经常遇到这种模式,我最终做的是:
if (object[key]) {
//exists
} else {
// Does not exist
}
所以我认为在你的情况下它将是:
if (groups[group_key]) {
// Exists
} else {
// Does not exist
}
let data = {key: 'John'}; console.log( data.hasOwnProperty('key') );
您应该使用in
运算符
key in object //true
!(key in object) //false
并且undefined
不能使用
obj["key"] !== undefined //false, but the key in the object
有关更多信息,请查看检查 JavaScript 对象中是否存在键?
您可以使用 hasOwnProperty() 函数。
var groups = [];
for (var i=0; i<something.length; i++) {
var group_key = 'group_'+something[i].group_id;
if (!groups.hasOwnProperty(group_key)) {
// New group
var group_details = {};
group_details[group_key] = {//maybe change to group_details =
group_name: something[i].group_name,
items: [
{ 'name': something[i].name }
]
};
//groups.push(group_details);
//change it to
groups[group_key] = group_details;
} else {
// Existing group
groups[group_key].items.push({
'name': something[i].name
});
}
}
您可以从对象中检索键并遍历列表并查看键是否存在:
var keys=Object.keys(object)
for(var i=0;i<keys.length;i++){
if(keys[i]=="your key"){//check your key here}
}
示例数组
[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid
如果需要,请扩展原型,(在这里使用 while 循环比 for in 快得多):
if (!('getKey' in Object.prototype)) {
Object.prototype.getKey = function(obj) {
var i=this.length;
while(i--)
{ if(this[i]===obj)
{return i;}
return;
}
};
}
那么你可以使用:
alert(exampleArray.getKey("overlaycenter"));
回报:1
还带有原型扩展:
if(!('array_flip' in Array.prototype)){
Array.prototype.array_flip=function(array) {
tmp_ar={}; var i = this.length;
while(i--)
{ if ( this.hasOwnProperty( i ) )
{ tmp_ar[this[i]]=i; }
} return tmp_ar;
};
}
然后你可以使用:
alert(exampleArray.array_flip(exampleArray['someelementid']);
回报:2
发现没有原型添加它也是功能性的
并最终更好地兼容脚本,因为每个人都说不要扩展原型......所以,......是的,如果你想用一个简单的 1 衬垫使用它,那么你可以使用:
function array_flip( array )
{ tmp_ar={}; var i = array.length;
while(i--)
{ if ( array.hasOwnProperty( i ) )
{ tmp_ar[array[i]]=i; }
} return tmp_ar;
}
和
alert(array_flip(exampleArray)['siteoverlay']);
返回 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.