2017-09-26 56 views
1

我有兩個數組:arrayOfIds和arrayOfScores。我需要將相應的id映射到score(1on1 map),最後我應該有{id_i,score_i}項的數組。從arrayOfIds的第一個ID到arrayOfScores的第一個分數。是否有更好的方法比使用double for循環更好?兩個陣列當然有相同的長度。兩個數組組合爲{array1 [i],array2 [i]}不帶雙重循環

實施例:

var arrayOfIds = ['4', '6', '8', '10', '12']; 
var arrayOfScores= [0.1, 0.5, 0.8, 0.3, 0.7]; 

結果:

var combined = [ {id: '4', score: 0.1}, 
       {id: '6', score: 0.5}, 
       {id: '8', score: 0.8}, 
       {id: '10', score: 0.3}, 
       {id: '12', score: 0.7} 
       ]; 
+1

爲了幫助你思考:爲什麼你會需要一個 '雙' 的循環?如果它們的長度相同,則可以使用一個循環,併爲兩個數組使用相同的迭代變量。 –

+1

爲什麼兩個循環?一個就足夠了。或者'Array.reduce()'或'Array.map()'或者'Array.forEach()' – Andreas

+0

@KarlReid我想象一下提問者的意思,不是嵌套for循環。對於初學者來說,這是一個可以理解的概念誤解。 –

回答

3

你可以只映射陣列中的一個,並使用索引來從所述其它陣列獲取數據,只要它們是同長度

var arrayOfIds = ['4', '6', '8', '10', '12']; 
 
var arrayOfScores = [0.1, 0.5, 0.8, 0.3, 0.7]; 
 

 
var combined = arrayOfIds.map((x,i) => ({id : x, score : arrayOfScores[i]})); 
 

 
console.log(combined)

1

我不知道爲什麼你需要一個雙重for循環。即使使用for循環,您也只需要一個。只需在兩個陣列上使用相同的索引。

var arrayOfIds = ['4', '6', '8', '10', '12']; 
 
var arrayOfScores = [0.1, 0.5, 0.8, 0.3, 0.7]; 
 
var result = []; 
 
for (var i = 0; i < arrayOfIds.length; i++) { 
 
    result.push({ 
 
    id: arrayOfIds[i], 
 
    score: arrayOfScores[i] 
 
    }); 
 
} 
 

 
console.log(result);

這假定長度是相同的。如果沒有,您需要爲此進行調整。

任何其他可用的循環結構都可以以類似的方式使用。這個想法是在每次迭代中訪問兩個數組。所以這是一個使用for of而不是其他一些現代功能的例子。

var arrayOfIds = ['4', '6', '8', '10', '12']; 
 
var arrayOfScores = [0.1, 0.5, 0.8, 0.3, 0.7]; 
 
var result = []; 
 
for (const [i, id] of arrayOfIds.entries()) { 
 
    result[i] = { 
 
    id, 
 
    score: arrayOfScores[i] 
 
    }; 
 
} 
 

 
console.log(result);

,這裏是用一個Array.from

var arrayOfIds = ['4', '6', '8', '10', '12']; 
 
var arrayOfScores = [0.1, 0.5, 0.8, 0.3, 0.7]; 
 
var result = Array.from(arrayOfIds, (id, i) => ({id, score: arrayOfScores[i]})) 
 

 
console.log(result);

0

你可以把短期使用lodash _.zip和一些ES6箭頭功能,陣列解構和速記對象屬性。

const ids = [1, 2, 3]; 
 
const scores = [1100, 1000, 900]; 
 

 
const result = _.zip(ids, scores).map(([id,score]) => ({id, score})); 
 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>