为什么这个对象循环不起作用?

时间:2015-11-14 02:56:06

标签: javascript arrays loops object for-loop

我想循环浏览此对象并添加' loc'如果他们的方面= 2,则为数组的值。我做错了什么?

2025是房间的对象,整个房间都是房间。

//Object
    {
      "2025": {
        "tom": {
          "side": 1,
          "loc": 111
        },
        "billy": {
          "side": 2,
          "loc": 222
        },
        "joe": {
          "side": 2,
          "loc": 333
        },
        "bob": {
          "side": 1,
          "loc": 444
        }
      }
    }

//Code
    var side2 = [];
    for (var key in rooms[room]) {
       if (rooms[room].hasOwnProperty(key)) {
          var obj = rooms[room][key];
          for (var prop in obj) {
             if (obj.hasOwnProperty(prop)) {

                     if(prop == 'loc') {
                         if(obj[prop] == 2) {
                            side2.push(key);
                         }

                 }
             }
          }
       }
    }
    console.log(side2);

3 个答案:

答案 0 :(得分:1)

您希望在side值为2时推送,因此您要检查side而不是loc。然后,您只需按obj.loc

即可
...
 if (obj.hasOwnProperty(prop)) {
     if(prop == 'side') {
         if(obj[prop] == 2) {
            side2.push(obj.loc);
         }
     }
 }
...

Fiddle Example

话虽如此,你可以简单地缩短这段代码,删除不需要的循环,并且你可以简单地将所有代码缩短为:

for (var key in rooms[room]) {
    var item = rooms[room][key];
    if(item.side == 2) 
        side2.push(item.loc)
}

Fiddle Example

答案 1 :(得分:0)

如果loc属性的值为2,则从您的语句中,您希望将side2属性的值推送到数组side

但是在你的代码中

if(prop == 'loc') {
   if(obj[prop] == 2) {
      side2.push(key);
   }
}

您正在将loc属性的值比较为2,而不是side属性的值。你可能需要像

这样的东西
if(prop == 'side') {
   if(obj[prop] == 2) {
      side2.push(obj['loc']);
   }
}

答案 2 :(得分:0)

正如评论和其他答案中所述,您正在寻找loc 2的{​​{1}}属性,该属性不存在。因此,可以通过将loc替换为side来解决当前问题(假设这是您想要的)。

但您的代码可以简化。在顶层循环很好。但是,代码的整个嵌套循环部分:

for (var prop in obj) {
   if (obj.hasOwnProperty(prop)) {
     if(prop == 'loc') {
       if(obj[prop] == 2) {
         side2.push(key);
       }
     }
   }
}

可以替换为

if (obj.side == 2) side2.push(key);

换句话说,您不需要遍历对象的属性来查找特定的属性(在这种情况下为side)。您只需obj.side即可访问它。

您还可以将此问题设想为想要将房间列表过滤到那些loc为2的人,在这种情况下您可以写:

Object.keys(rooms) . filter(hasPeopleWithLoc(2))

,其中

function hasPeopleWithLoc(loc) {
  return function(roomKey) {
    var room = rooms[roomKey];
    return Object.keys(room) . some(function(personKey) {
      return room[personKey].loc === loc;
    });
  };
}

请注意,如果该会议室中的任何人的loc为{2},则此代码只会为结果中的一个会议室留下一个条目。原始代码的行为略有不同;它为该会议室中每个人员提供了所需loc的结果。