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

Why isn't this object loop working?

本文关键字:对象 循环 不起作用 为什么不      更新时间:2023-09-26

如果side=2,我想循环遍历这个对象,并将'loc'值添加到数组中。我做错了什么?

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

side的值为2时,您希望推送,因此您希望检查side而不是loc。然后你可以简单地推obj.loc

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

Fiddle示例


话虽如此,你可以将代码缩短一点,消除不必要的循环。你可以将所有代码缩短为:

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

Fiddle示例

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

但在你的代码

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

您正在比较loc属性的值为2,而不是side属性的值。你可能需要类似的东西

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

如注释和其他答案中所述,您正在寻找2loc属性,但该属性不存在。因此,直接的问题可以通过用side替换loc来解决(假设这是您想要的)。

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

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,则此代码将在结果中为该房间只留下一个条目。您的原始代码的行为略有不同;它在具有所需CCD_ 19的房间中的每个人的结果中放入该房间的条目。