两个数组组合成{array1 [i],array2 [i]},没有双循环

时间:2017-09-26 16:23:37

标签: javascript arrays

我有两个数组:arrayOfIds和arrayOfScores。我需要将相应的id映射到得分(1on1 map),最后我应该有{id_i,score_i}项的数组。从arrayOfIds到arrayOfScores的第一个得分的第一个id。有没有比使用双循环更好的方法呢?两个阵列当然都有相同的长度。

示例:

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}
               ];

3 个答案:

答案 0 :(得分: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 :(得分:1)

我不确定为什么你需要一个双循环for this。即使使用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);

答案 2 :(得分: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>