【问题标题】:Why isn't this object loop working?为什么这个对象循环不起作用?
【发布时间】:2015-11-14 02:56:05
【问题描述】:

如果他们的边 = 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);

【问题讨论】:

  • 因为没有loc 属性有值2?在调试器中逐步执行此操作应该可以帮助您弄清楚。但是你为什么要遍历查找loc 的键呢?你可以做obj.loc
  • 是的,loc 没有值 2,但 side 没有值 2。你想做类似if(prop == 'side') { if(obj[prop] == 2) { side2.push(key); }

标签: javascript arrays loops object for-loop


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

【讨论】:

    【解决方案2】:

    从您的语句中,如果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']);
       }
    }
    

    【讨论】:

    • 这与仅用 side2.push(obj.side) 替换整个循环有何不同/更好?
    • 我相信他说他希望将loc 属性的值添加到side2 数组,而不是obj.side 的值。并且还根据他的问题陈述他想将属性loc的值添加到数组(side2)中。所以我不知道他为什么要添加key
    【解决方案3】:

    如 cmets 和其他答案中所述,您正在寻找不存在的 2loc 属性。所以直接的问题可以通过将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

    【讨论】:

    • 这对于 OP 来说都是很好的信息,可以用来删除不必要的工作并缩短他们的代码。但这如何解决他们手头的问题? OP 并不打算将 side 的所有值添加到数组中。
    • @SpencerWieczorek 不,实际上他似乎想将房间号推入数组中。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多