簡體   English   中英

檢查對象內是否存在對象鍵

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

方案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']);

回報:2

方案C

發現沒有原型添加它也是功能性的

並最終更好地兼容腳本,因為每個人都說不要擴展原型......所以,......是的,如果你想用一個簡單的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM