2016-11-12 57 views
1

我是一名JS初學者,正在做基礎教程。我正在嘗試執行zip函數以返回{videoID:bookmarkID}的列表。所以,舉個例子:Javascript:如何將動態鍵插入地圖/對象?

var videos = [ 
     { 
      "id": 70111470, 
      "title": "Die Hard" 
     }, 
     { 
      "id": 654356453, 
      "title": "Bad Boys" 
     }, 
     { 
      "id": 65432445, 
      "title": "The Chamber" 
     } 
    ], 
    bookmarks = [ 
     {id: 470, time: 23432}, 
     {id: 453, time: 234324}, 
     {id: 445, time: 987834} 
    ]; 
} 

這不工作(我得到意外的標記 ' '):

return Array.zip(videos,bookmarks, function(v, b){ 
    return {v.id: b.id}; 
}); 

這種做法,但返回一個包含列表{' V':bookmarkID}:

return Array.zip(videos,bookmarks, function(v, b){ 
    return {v: b.id}; 
}); 

如何獲得視頻ID作爲值bookmarkID的關鍵?此外,這些技術圖或對象?謝謝。

+0

這兩個id如何映射在一起?最後三位數字? –

+1

只是按照列表的順序,所以帶有第一個書籤ID的第一個視頻ID等等。 – luxon

回答

2

嘗試:

return Array.zip(videos,bookmarks, function(v, b){ 
    return {[v.id]: b.id}; 
}); 
+0

這就是我要找的!你能解釋爲什麼這種方法有效嗎?爲什麼我的方法不行zip實現只是循環遍歷兩個數組,並在左右列表中的每個元素上運行該函數,所以爲什麼我不能在兩個數組中傳遞ID? – luxon

+0

我不知道這個,很好! – acontell

+0

這實際上是一個新的JS功能,它帶有新的ES6,它的名字是Computed Property Names – Khang

1

你可以映射一個具有相同索引得到其他的elemnt。

var videos = [{ "id": 70111470, "title": "Die Hard" }, { "id": 654356453, "title": "Bad Boys" }, { "id": 65432445, "title": "The Chamber" }], 
 
    bookmarks = [{ id: 470, time: 23432 }, { id: 453, time: 234324 }, { id: 445, time: 987834 }], 
 
    zipped = videos.map(function (v, i) { 
 
     var o = {}; 
 
     o[v.id] = bookmarks[i].id; 
 
     return o; 
 
    }); 
 

 
console.log(zipped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6

var videos = [{ "id": 70111470, "title": "Die Hard" }, { "id": 654356453, "title": "Bad Boys" }, { "id": 65432445, "title": "The Chamber" }], 
 
    bookmarks = [{ id: 470, time: 23432 }, { id: 453, time: 234324 }, { id: 445, time: 987834 }], 
 
    zipped = videos.map((v, i) => ({ [v.id]: bookmarks[i].id })); 
 

 
console.log(zipped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

這返回{videoID:v.id,bookmarkID:書籤[i] .id},我正在尋找{v.id :bookmark.id} – luxon

0

你的第一次嘗試不起作用,因爲你使用的對象的關鍵是不正確的。當您使用對象文字來定義對象時,鍵必須是數字或字符串文字。

另一方面,您可以使用類似數組的表示法在對象中創建該鍵來解決該問題。在JS中,有兩種方法可以訪問對象內的鍵的值:使用點符號或類似數組的符號。類似數組的符號允許您訪問直到運行時才確定的對象的鍵(變量爲鍵)。例如:

var obj = {}; 
 
for(var i = 0; i < 3; i++) 
 
    obj[i] = i + 1; 
 
console.log(obj);

在你感興趣的情況下,沒有在兩者之間性能方面太大的區別。

回到您的問題。根據功能程序員的說法,Zip是一個函數,它接受一對列表並創建一個列表對。從我的觀點(以及我認爲的功能角度)來看,解決這個問題可能與你所做的有所不同。

例如(以及同樣快速的想法),你可以創建一個具有拉鍊(典型ZIP)的功能,適用於結果到挑選你感興趣的值的另一個功能:

var videos = [{ 
 
    "id": 70111470, 
 
    "title": "Die Hard" 
 
    }, { 
 
    "id": 654356453, 
 
    "title": "Bad Boys" 
 
    }, { 
 
    "id": 65432445, 
 
    "title": "The Chamber" 
 
    }], 
 
    bookmarks = [{ 
 
    id: 470, 
 
    time: 23432 
 
    }, { 
 
    id: 453, 
 
    time: 234324 
 
    }, { 
 
    id: 445, 
 
    time: 987834 
 
    }]; 
 

 
// Assuming same size. 
 
function zip(list1, list2) { 
 
    return list1.length ? 
 
    [[list1[0], list2[0]]].concat(zip(list1.slice(1), list2.slice(1))) : []; 
 
} 
 

 
function makeObj(list) { 
 
    var obj = {}; 
 
    obj[list[0].id] = list[1].id; 
 
    return obj; 
 
} 
 

 
console.log(zip(videos, bookmarks).map(makeObj));

我使用遞歸(有最佳的辦法做到這一點,也可以做考慮到該列表可以有不同的大小),但我認爲它可以幫助你掌握了一個簡單的拉鍊這個想法。

希望它有幫助

+0

感謝您的詳細解釋;這真的很有幫助! – luxon