[英]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.