2015-11-14 84 views
0

我想遍历这个对象,并将'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); 
+1

因为'loc'属性没有vaue'2'吗?在调试器中逐步完成此操作应该可以帮助您找出问题所在。但是,为什么你要循环查找'loc'的键呢?你可以做'obj.loc'。 – 2015-11-14 03:02:28

+0

对于'loc','side'没有值2。你想做一些事情,比如if(prop =='side')if(obj [prop] == 2){side2.push(key); }' –

回答

1

你要推时side2,所以要检查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

0

从你的说法,你要loc财产的价值推到阵列side2如果side属性的值为2

但在你的代码

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

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

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

这与从'side2.push(obj.side)'替换整个循环有什么不同? – 2015-11-14 03:23:34

+0

我相信他说他希望将'loc'属性的值添加到'side2'数组而不是'obj.side'的值。并且根据他的陈述**,他希望将属性loc的vlaue添加到数组(side2)**中。所以我不知道他为什么要为它添加“键”。 –

0

正如在评论和其他答案中所述,您正在寻找 2不存在的财产。所以眼前的问题可以通过用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,则此代码只会为结果中的房间输入一个条目。您的原始代码行为稍有不同;它在房间中输入房间的结果为每个人在该房间中的所需loc

+0

这是OP知道删除不必要的工作并缩短代码的所有好信息。但这是如何解决他们面临的问题?操作系统并不想将'side'的所有值添加到数组中。 –

+0

@SpencerWieczorek不,实际上他似乎想把房间号码推入阵列。 – 2015-11-14 03:56:06