2016-01-27 76 views
0

所以我想做一個最基本的事情,我想知道我的方法有什麼問題。在javascript中空陣列的長度

我有一個包含客房

{ rooms: 
    { ijxeczyu: 
     { Id: 'ijxeczyu', 
     teacherName: 'testteacher', 
     teacherId: '/#Ikosyfr1NtDcpKbaAAAA', 
     clients: [] } }, 
    getRooms: [Function], 
    addRoom: [Function] } 

現在我想使自己在玉表信息的對象。 對於工作,我想提取重要的東西,並把它推到一個數組

function makeArray(obj) { 

    var roomArray = []; 

    for (var room in obj) { 
    roomArray.push({ 
     roomId : room.Id, 
     teacher : room.teacherName, 
     clients : room.clients.length || 0 
    }) 
    } 
    return roomArray; 
} 

很容易。 我不能讓空的客戶端陣列工作。 TypeError: Cannot read property 'length' of undefined 是不是正是|| 0部分應該抓到的?

爲什麼不能正常工作?如果沒有條目,我該如何讀取數組的長度或0

+2

假設你意味着room.clients是不確定的,那麼'|| 0'太晚了。相反,你可以這樣做: '(room.clients || [])。length' –

回答

4

room.clientsundefined這就是爲什麼你得到這個錯誤。原因是undefined是因爲room是一個字符串。

A for..in loop遍歷對象的鍵。這意味着room === "ijxeczyu",假設你傳遞了你的rooms對象。要訪問該對象,您必須訪問對象

for (var name in obj) { 
    var room = obj[name]; 
    ... 
} 
+0

aaaaahhhh ok。現在它是有道理的。所以基本上,for..in循環與標準for循環相比幾乎沒有優勢? – user3787706

+0

@ user3787706優點是您可以使用它遍歷對象的鍵。一個標準的'for'循環用於迭代數組。 '(var key in obj)'與'for(var i = 0; i

+0

Ecmascript 7增加了'對象值',它對值而不是鍵進行迭代。 – Barmar