我試圖創建一個對象,該對象需要從包含在函數中的四個數組映射 數據。目標 是使用函數式編程完成新地圖。 因此,例如,可以使用方法map,reduce,forEach,concat和 過濾器以及自定義函數。使用函數式編程將多個對象數組中的數據映射到Javascript中的新對象
我已經使用for-loops, 到達了一個非功能性解決方案,我已經在下面列出了它。不過,我陷入了純粹的功能性方法。
想要的結果的數據集和數據可以是 在http://jhusain.github.io/learnrx/處獨立查看,儘管我已經包含了下面的數據。
目標是使用函數式編程重新映射數據,以使其類似於所需的輸出(下面包含)。
我希望幫助重新映射數據使用功能的方法 並從下面顯示的數據開始。
問題的確切的文本規定:
練習26:從數組轉換到更深的樹木
讓我們嘗試創造一個更深層次的樹狀結構。這次我們有4個 分別包含列表,視頻,boxarts和書籤 的單獨陣列。每個對象都有一個父代號,表示它的父代。我們 想要建立一個列表對象的數組,每個列表對象都有一個名字和一個視頻 數組。視頻數組將包含視頻的ID,標題,書籤 時間以及最小的boxart網址。換句話說,我們要建立的 以下結構:
所需的輸出是:
[
{
"name": "New Releases",
"videos": [
{
"id": 65432445,
"title": "The Chamber",
"time": 32432,
"boxart": "http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg"
},
{
"id": 675465,
"title": "Fracture",
"time": 3534543,
"boxart": "http://cdn-0.nflximg.com/images/2891/Fracture120.jpg"
}
]
},
{
"name": "Thrillers",
"videos": [
{
"id": 70111470,
"title": "Die Hard",
"time": 645243,
"boxart": "http://cdn-0.nflximg.com/images/2891/DieHard150.jpg"
},
{
"id": 654356453,
"title": "Bad Boys",
"time": 984934,
"boxart": "http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg"
}
]
}
]
在作爲出發點如下下面的函數。
我已經命名函數「combine」,以便我們可以調用它。另外,我在 函數的末尾添加了我的解決方案,它由for循環組成,位於書籤數組之後。我在一個實用的解決方案只 嘗試了這麼遠:
return lists.map(function(list) {
return {
name: list.name,
videos:
videos.
filter(function(video) {
return video.listId === list.id;
}). // I got stuck at this point.
這是起始組數據:
function combine() {
var lists = [
{
"id": 5434364,
"name": "New Releases"
},
{
"id": 65456475,
name: "Thrillers"
}
],
videos = [
{
"listId": 5434364,
"id": 65432445,
"title": "The Chamber"
},
{
"listId": 5434364,
"id": 675465,
"title": "Fracture"
},
{
"listId": 65456475,
"id": 70111470,
"title": "Die Hard"
},
{
"listId": 65456475,
"id": 654356453,
"title": "Bad Boys"
}
],
boxarts = [
{ videoId: 65432445, width: 130, height:200, url:"http://cdn-0.nflximg.com/images/2891/TheChamber130.jpg" },
{ videoId: 65432445, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/TheChamber200.jpg" },
{ videoId: 675465, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/Fracture200.jpg" },
{ videoId: 675465, width: 120, height:200, url:"http://cdn-0.nflximg.com/images/2891/Fracture120.jpg" },
{ videoId: 675465, width: 300, height:200, url:"http://cdn-0.nflximg.com/images/2891/Fracture300.jpg" },
{ videoId: 70111470, width: 150, height:200, url:"http://cdn-0.nflximg.com/images/2891/DieHard150.jpg" },
{ videoId: 70111470, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/DieHard200.jpg" },
{ videoId: 654356453, width: 200, height:200, url:"http://cdn-0.nflximg.com/images/2891/BadBoys200.jpg" },
{ videoId: 654356453, width: 140, height:200, url:"http://cdn-0.nflximg.com/images/2891/BadBoys140.jpg" }
],
bookmarks = [
{ videoId: 65432445, time: 32432 },
{ videoId: 675465, time: 3534543 },
{ videoId: 70111470, time: 645243 },
{ videoId: 654356453, time: 984934 }
];
//My non-functional solution
sizeArr = [];
for(var i = 0; i < lists.length; i++){
lists[i].videos = [];
for(var j = 0; j < videos.length; j++){
if(videos[j].listId === lists[i].id){
lists[i].videos.push(videos[j]);
}
for(var k = 0; k < bookmarks.length; k++){
if(bookmarks[k].videoId === videos[j].id && videos[j].listId === lists[i].id){
videos[j].time = bookmarks[k].time;
}
for(var l = 0; l < boxarts.length; l++){
var size = boxarts[l].width * boxarts[l].height;
sizeArr.push(size);
sizeArr = sizeArr.sort(function(min, max){
if(min < max){
return min;
}
if(boxarts[l].videoId === videos[j].id && videos[j].listId === lists[i].id){
videos[j].boxart = boxarts[l].url;
}
});
}
}
}
delete lists[i].id;
}
return lists;
}
combine();
好像你已經離開做的一切都是'.forEach()'以上您篩選的視頻以及每個視頻的'.forEach()'*(或'.reduce()')*,並通過'boxart'數組找到具有與當前'video.id'匹配的'videoId'的條目。並將其'url'屬性分配給'video.boxart'。然後用'書籤'做同樣的事情。 – 2015-07-10 19:45:07
謝謝。我可能一直過於專注於使用filter()來排除其他方法。 – davisec52