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

17

我正在尝试从现有对象中提取一些数据并将其分组到一个新对象中。我遇到的问题是检查对象键是否存在,以便我可以创建一个新的对象,或将数据附加到现有对象。

我发现了一些类似的问题,但是没有答案适用于我的情况,所以我有点困惑。它总是最终发现键不存在并创建重复的键。

我有以下代码,其中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'
    }
]

你需要展示你的数组/对象。 - epascarello
@KenTenMen,请看一下我的更新答案,它解决了其他问题。 - plalx
1
可能是以下问题的重复:如何检查 JavaScript 对象中是否存在一个键? - Kaibo
7个回答

34

实现这一点的最佳方式是依赖于 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) {}来检查组是否存在。


太完美了。我甚至都不记得为什么一开始要把它变成数组,但今天真的很长,这个修复了它! - KenTenMen

4

我经常遇到这种模式,我的做法是:

if (object[key]) {
    //exists
} else {
    // Does not exist
}

我认为在你的情况下,应该是这样的:
if (groups[group_key]) {
    // Exists
} else {
    // Does not exist 
}

7
警告:此实现仅在object[key]永远不会包含假值,比如0或false或""时才能工作。您可以改为比较object[key] !== undefined,这样即使存在假值也能正常工作。 - jfriend00
1
@jfriend00非常正确。事实上,我会说这个答案之所以不正确就是因为这个原因。 - Matt
1
@jfriend00 你觉得 ({k: void(0)}).k !== undefined; //false 怎么样?最可靠的方法是使用 in - plalx

1

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


4
尽管这段代码片段可能解决了问题,但包括一些解释真的有助于提高您帖子的质量。请记住,您正在回答未来读者的问题,而那些人可能不知道您提出代码建议的原因。 - DimaSan

1

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
        });

    }

}

0
你可以从对象中检索键,并遍历列表,查看该键是否存在:
var keys=Object.keys(object)
for(var i=0;i<keys.length;i++){
     if(keys[i]=="your key"){//check your key here}
}

0

示例数组

[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid

解决方案 A

如果需要,可以扩展原型(此处使用 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

发现即使不添加原型也是有效的

而且最终更适合于兼容脚本,因为每个人都不建议扩展原型...所以,是的,如果你想要使用一个简单的一行代码,那么你可以使用:

    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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接