2017-07-02 47 views
1

我無法理解遍歷數組與迭代對象屬性之間的區別。在對象的屬性和數組之間迭代有什麼區別Javascript

是什麼區別:

for (key in object) { 
DO THIS 
} --> for objects 

for (var i = 0 ; i<array.length ; i++) { 
DO THIS 
} --> for arrays 

如果我想將對象值的特性中的陣列相比,可予同時通過對象迭代,並該數組在相同的功能。例如,像這樣:

for (var key in object){ 
if (object.hasOwnProperty(key)){ 
    for (i=0 ; i<array.length; i++){ 
    if (object[key] === array[i]){ 
    filteredKeys[key] = object [key]} 

我的最終目標是編寫一個函數,它接受一個對象和按鍵的排列,並返回一個新的對象,只有在數組中的鍵。

+0

認爲你的意思是代替if。無論如何,你是問一個數組for循環和for-in循環之間的區別循環對象的可枚舉屬性? – Li357

+0

謝謝,是的,我的意思是(var i = 0 ...),編輯我的問題。是的,如果我想將數組中的值與對象中的屬性進行比較,詢問兩者之間有什麼區別以及是否將兩者都包含在同一個函數中。 – Ana

回答

0

你必須明白的是,數組只是一些特殊的對象,它們的屬性是數字(表示索引),值指示了這些索引處的元素 - 它們具有與任何對象一樣的鍵和值。隨着for循環是這樣的:

for(var i = 0; i < arr.length; i++) { 
    arr[i]; //iterating through the array and accessing each element 
} 

你只是訪問數字鍵像任何其他目的,只是通過bracket notation因爲arr.0是無效的語法。現在使用for ... in循環,您只需遍歷對象的枚舉屬性即可。正如我所說的,數組的索引(意思是0,1,2等)只是數組對象的關鍵字!因此,對於環上面並與此相同:

for(var i in arr) { 
    arr[i]; 
} 

由於該陣列的索引是鍵,此迭代通過鍵(索引),從而可以訪問數組的元素。


爲了解決您的其他問題 - 你可以通過對象以相同的循環迭代不是一個數組,如果他們有不同的密鑰。數組以數字索引作爲鍵進行排序,對象的鍵可以是任何東西。它們的鍵不一定相同,因此從數組和對象訪問該鍵不會產生正確的結果。

相反,如果你想從基於對象過濾掉某些鍵,如果他們在一個數組或沒有,請嘗試以下操作:

function filterKeysByArray(object, keys) { 
    return keys.reduce((filteredObj, key) => { 
    if(object.hasOwnProperty(key)) { 
     filteredObj[key] = object[key]; 
    } 
    return filteredObj; 
    }, {}); 
} 

這樣就完全避免嵌套的for循環。它只遍歷傳遞數組中的鍵並將其減少到單個對象,即過濾對象。它檢查對象是否具有由該鍵指定的屬性,如果是,則將其添加到過濾的對象。

+0

感謝您澄清重新對象/數組!對於另一個問題,這不完全是我所指的 - 將編輯我的問題來澄清。 – Ana

+0

@Ana Ahh,我明白了。在這種情況下,你不能真正消除第二個循環,因爲數組循環循環遍歷屬性0,1,2等,而for-in循環遍歷對象的鍵,這些鍵不一定是0,1, 2等,但你可以用ES6代碼縮短它。 – Li357

+0

@Ana我用示例實現更新了我的答案。 – Li357

0

對象和數組在JavaScript中基本上是不同的數據結構。對象是鍵值對的集合,而數組是有序的數據列表。

迭代通過對象鍵不同於迭代數組,因爲您正在訪問不同類型的數據結構中的數據。

我的最終目標是編寫一個函數,它接受一個對象和一個鍵數組,並返回一個只有數組中的鍵的新對象。

這可以通過做這樣的事情來完成:

function filterObject(obj, keys) { 
    var newObj = {}; 
    for (var i = 0; i < keys.length; i++) { 
    if (keys[i] in obj) { 
     newObj[keys[i]] = obj[keys[i]]; 
    } 
    } 
    return newObj; 
} 

例如,調用filterObject({'one': 1, 'two': 2}, ['one', 'three'])會產生的結果{'one': 1}

+0

對不起,我的措辭有點不清楚。我的意思是新對象只會返回數組中找到的鍵和原始對象,而不是數組中的所有鍵。 例如,如果對象具有屬性名稱和年齡。數組有[「名稱」,「職業」],我只希望我的新對象包含屬性名稱和相應的值。 – Ana

+0

是的,你可以確保新對象只包含原始對象中的鍵,方法是在將值添加到新對象之前向循環中添加一個附加條件。我相應地修改了我的答案。 –

+0

但是在這種情況下,'keys'沒有被定義,這是我在我的函數中沒有包含「for(var keys in object)」的問題。 – Ana

相關問題