我试图从现有对象中获取一些数据并将其分组为新对象。我遇到的问题是检查对象密钥是否存在,这样我就可以创建一个新的,或者将数据附加到现有密钥。
我发现了一些类似的问题,但没有一个答案有效,所以我有点卡住了。它总是发现它不存在并创建重复的密钥。
我有以下代码,其中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'
}
]
答案 0 :(得分:30)
实现这一目标的最佳方法是依赖于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) {}
答案 1 :(得分:4)
我经常遇到这种模式,我最终做的是:
if (object[key]) {
//exists
} else {
// Does not exist
}
所以我认为在你的情况下会是:
if (groups[group_key]) {
// Exists
} else {
// Does not exist
}
答案 2 :(得分:1)
let data = {key: 'John'};
console.log( data.hasOwnProperty('key') );
&#13;
答案 3 :(得分:1)
您应该使用in
运算符
key in object //true
!(key in object) //false
并且不能使用undefined
obj["key"] !== undefined //false, but the key in the object
答案 4 :(得分:0)
您可以使用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
});
}
}
答案 5 :(得分:0)
您可以从对象中检索密钥并遍历列表并查看密钥是否存在:
var keys=Object.keys(object)
for(var i=0;i<keys.length;i++){
if(keys[i]=="your key"){//check your key here}
}
答案 6 :(得分:0)
ExampleArray
[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid
扩展原型,(在这里使用while循环比在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