2016-03-06 259 views
1

我是JavaScript和AngularJS的新手。我正在嘗試循環一個對象,獲取它的鍵值對,然後使用它來構建一個新對象的數組。AngularJS循環一個對象來構建一個對象數組

var actorMovie = { 
    "Leonardo DiCaprio" : "The Revenant", 
    "Christian Bale" : "The Dark Knight Rises", 
    "Sylvester Stallone" : "Rocky" 
}; 

if(actorMovie){ 
    var actorMovieArray = []; 
    angular.forEach(actorMovie, function(value, key) { 
     actorMovieArray.push ({key: { 
      "Movies": { 
       "Best Movie": value 
      } 
     }}); 
    }); 
} 

console.log(actorMovieArray); 

這個控制檯日誌打印出正確的價值觀,但關鍵的遺體爲「關鍵」,從來沒有如預期更新到演員的名字。 我在這裏做錯了什麼?我試圖尋找答案,但沒有找到任何解決方案。我錯過了什麼嗎?

回答

1

我會做類似

angular.forEach(actorMovie, function(value, key) { 
    actorMovieArray[key]= { 
     "Movies": { 
      "Best Movie": value 
     } 
    }; 
}); 

在代碼中,JavaScript不知道,你要評估key變量分配財產,並認爲關鍵是key字符串。

+0

工作就像一個魅力。謝謝。 – Sunil

+0

不客氣! –

+0

但是,我想知道在我的代碼中,JS如何評估價值,但不是關鍵? – Sunil

0

正如@Hugues指出的那樣,JavaScript沒有辦法知道你的鍵是作爲文字還是變量,所以使用了字面值。

請注意,答案在你的問題中的行爲與你想要的不一樣。使用密鑰作爲數組的識別有兩個缺點:

  • 遍歷鍵時,無法保留項目的順序
  • 如果存在具有相同的密鑰(這裏的演員的名字)兩個項目,則只有在覆蓋一些以前增加的值時纔會得到結果中的一個。 (這是不是真的情況下,你的輸入已經是一個對象字面使重複鍵是不關心,但切換到其他一些輸入時可能是一個問題,如項目的數組)

這可能是隻要順序無關緊要,你知道你的鑰匙是獨一無二的。如果你想在你的問題中定義的結構,請考慮下面的代碼片段:

function buildItem(value, key) { 
    var res = {}; 
    res[key] = { 
      "Movies": { 
       "Best Movie": value 
      } 
     }; 
    return res; 
} 

if(actorMovie){ 
    var actorMovieArray = []; 
    angular.forEach(actorMovie, function(value, key) { 
     actorMovieArray.push(buildItem(value, key)); 
    }); 
} 

嘗試這個jsbin:http://jsbin.com/luborejini/edit?js,console

0

我會用Object.keys和Array.forEach所產生的陣列上。我也會接受Javascript的功能性。這樣,您可以輕鬆地將創建者函數提取到工廠映射庫中以獲取您的api json數據。

if(actorMovie){ 
var actorMovieArray = []; 
Object.keys(actorMovie).forEach(function(actor){ 
    actorMovieArray[actor] = function(){ 
     return { 
      Movies: { 
       BestMovie: actorMovie[actor] 
      } 
     }; 
    }(); 
}); 

}

我也建議不要使用演員名字作爲數組中的關鍵。我寧願把它映射到一個模型結構,它會使你的意見/控制器的清潔和更容易理解:

if(actorMovie){ 
var actorMovieArray = []; 
Object.keys(actorMovie).forEach(function(actor) { 
    actorMovieArray.push(function(){ 
     return { 
      Actor: actor, 
      Movies: { 
       BestMovie: actorMovie[actor] 
      } 
     }; 
    }()); 
}); 

}

這將推動你進入更加簡潔視圖模型,並設置你的一旦你的結構就位,就可以輕鬆地進行重構。至少在我看來,它也會使測試更容易。

相關問題