检查数组中是否存在对象键

时间:2013-09-20 17:55:30

标签: javascript json 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'
    }
]

7 个答案:

答案 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)

&#13;
&#13;
let data = {key: 'John'};
console.log( data.hasOwnProperty('key') );
&#13;
&#13;
&#13;

答案 3 :(得分:1)

您应该使用in运算符

key in object     //true
!(key in object)  //false

并且不能使用undefined

obj["key"] !== undefined //false, but the key in the object

有关更多信息,请查看Checking if a key exists in a JavaScript 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

解决方案A

如果你愿意的话,

扩展原型,(在这里使用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

解决方案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