Javascript 检查对象中是否存在对象键
我试图从现有对象中获取一些数据,并将其分组到新对象中。我遇到的问题是检查对象键是否存在,以便我可以创建一个新的对象键,或者将数据附加到现有的对象键 我发现了一些类似的问题,但没有一个答案有效,所以我有点卡住了。它总是发现它不存在并创建重复的键 我有以下代码,其中Javascript 检查对象中是否存在对象键,javascript,json,object,Javascript,Json,Object,我试图从现有对象中获取一些数据,并将其分组到新对象中。我遇到的问题是检查对象键是否存在,以便我可以创建一个新的对象键,或者将数据附加到现有的对象键 我发现了一些类似的问题,但没有一个答案有效,所以我有点卡住了。它总是发现它不存在并创建重复的键 我有以下代码,其中xxx是我需要检查密钥是否存在的地方: var groups = []; for (var i=0; i<something.length; i++) { var group_key = 'group_'+som
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
});
}
}
我经常遇到这种模式,最后我做的是:
if (object[key]) {
//exists
} else {
// Does not exist
}
因此,我认为你的情况是:
if (groups[group_key]) {
// Exists
} else {
// Does not exist
}
实现这一点的最佳方法是依赖于这样一个事实,即
in
操作符返回一个布尔值,该值指示对象中是否存在键
var o = {k: 0};
console.log('k' in o); //true
但这不是您的唯一问题,您没有任何允许您检查密钥是否已存在的查找对象。不要使用数组,而是使用普通对象
var groups = {};
然后,不要使用组。按(…)
,而是执行组[group\u key]=group\u详细信息代码>
然后,您可以通过执行if(group_key in groups){}
检查组是否存在。您可以使用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组=[];
对于(var i=0;i,您可以从对象中检索键并遍历列表,查看键是否存在:
var keys=Object.keys(object)
for(var i=0;i<keys.length;i++){
if(keys[i]=="your key"){//check your key here}
}
var keys=Object.keys(对象)
对于(var i=0;iExampleArray
[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid
解决方案A
如果需要,可以扩展原型(这里的函数使用while循环,它比in快得多):
然后您可以使用:
alert(exampleArray.getKey("overlaycenter"));
回报:1
解决方案B
还包括原型扩展:
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']);
function array_flip( array )
{ tmp_ar={}; var i = array.length;
while(i--)
{ if ( array.hasOwnProperty( i ) )
{ tmp_ar[array[i]]=i; }
} return tmp_ar;
}
收益:2
溶液C
发现没有原型添加它也是功能性的
最终,对于兼容脚本来说更好,因为每个人都说不要扩展原型…因此,…是的,如果您想将其与easy 1 liner一起使用,那么您可以使用:
alert(exampleArray.array_flip(exampleArray['someelementid']);
function array_flip( array )
{ tmp_ar={}; var i = array.length;
while(i--)
{ if ( array.hasOwnProperty( i ) )
{ tmp_ar[array[i]]=i; }
} return tmp_ar;
}
及
返回0
let data={key:'John'};
console.log(data.hasOwnProperty('key'));
您应该使用中的操作符
key in object //true
!(key in object) //false
无法使用未定义的和
obj["key"] !== undefined //false, but the key in the object
有关更多信息,请查看您需要显示阵列/object@KenTenMen,请查看我的更新答案,它解决了其他问题。警告可能重复,只有在对象[key]
不能包含虚假值(如0
或虚假
或时,此确切实现才有效。”
。您可以比较对象[key]!==未定义的,即使存在错误的值,它也会起作用。@jfriend00非常正确。事实上,我甚至会说,正是出于这个原因,@jfriend00关于({k:void(0)})呢).k!==undefined;//false
,最可靠的方法是使用中的.Perfick。我甚至不记得当初为什么要把它做成一个数组,但这是漫长的一天,这已经解决了它!虽然这个代码片段可以解决这个问题,但确实有助于提高您的帖子质量。请记住,您是在为r回答这个问题这些人可能不知道您的代码建议的原因。
obj["key"] !== undefined //false, but the key in the object