2015-11-14 82 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