2017-08-30 63 views
0

我有数组列表以这种格式JavaScript的地图和减少数组列表

data = [[1,2,3,4,5,6,7,8,9,10], 
[11,12,13,14,15,16,17,18,19,20], 
[21,22,23,24,25,26,27,28,29,30]] 

我想在这个格式

[[11/1, 12/2,13/3,14/4,15/5,16/6,17/7,18/8,19/9,20/10], 
    [21/11,22/12,23/13,24/14,25/15,26/16,27/17,28/18,29/19,30/20]] 

输出我已经使用了循环,这是它的外观

const totalData = data.length; 
for(var i =0 ; i < totalData ; i++){ 
    for(var j =0; j < data[i].length; j++){ 
    console.log(data[i+1][j]/data[i][j]); 
    } 
} 

我想将此转换为使用javascript地图并减少?有没有可能的方法? 谢谢

+0

那是一个阵列以数字1-30,或三个阵列?数组中的数字可以不同吗?阵列的长度可以不同?你为什么想要使用map/reduce? – alexanderbird

+0

它可以有三个以上的数组。数组中的数字将完全不同。长度可能不相等,但我们可以使用条件来检查每个数组的长度。我认为循环不是一个好习惯,所以想使用map/reduce。谢谢 –

+0

您将需要将您的代码更改为'我 Bergi

回答

2

for循环并不是不好的做法,它们只是不适合功能性的编程风格。下面的解决方案的前提是阵列长度相等:

const data = [ 
 
    [1,2,3,4,5,6,7,8,9,10], 
 
    [11,12,13,14,15,16,17,18,19,20], 
 
    [21,22,23,24,25,26,27,28,29,30] 
 
]; 
 

 
const result = data.map((arr, index) => { 
 
    const next = data[index + 1]; 
 
    if (!Array.isArray(next)) { 
 
    return; 
 
    } 
 
    return arr.map((item, i) => next[i]/item); 
 
}).filter(Boolean); 
 

 
console.log(result);

我相信你能弄清楚做什么,如果数组的长度是不相等的。

+0

Sweet, 这就是我想要的 –

0

你需要为每个任务创建分离功能:

/** 
* Combine 2 arrays 
* @param Array a 
* @param Array b 
*/ 
function combineArrays(a, b) { 

    var combined = []; 

    for (var i = 0; i < a.length; i++) 
     combined.push(a[i]/b[i]); 

    return combined; 
} 

/** 
* Combine an group of arrays 
* @param Array group 
*/ 
function combineGroup(group) { 
    var newGroup = []; 
    for (var i = 0; i < group.length - 1; i++) 
     newGroup.push(combineArrays(group[i], group[i + 1])); 

    return newGroup; 

} 

第一个功能结合起来只有2个阵列。 第二个函数结合了许多数组并返回你想要的。

0

如果长度不相等,则较长长度的项目中的项目将被忽略。

data = [ 
    [1,2,3,4,5,6,7,8,9,10], 
    [11,12,13,14,15,16,17,18,19,20], 
    [21,22,23,24,25,26,27,28,29,30] 
]; 

result = data.reduce((acc,current,i)=>{ 
     var ret; 
     if(data[i].length <= data[i-1].length) 
     ret = data[i].map((item,j)=>(item/data[i-1][j])); 
     else 
     ret = data[i-1].map((item,j)=>(data[i][j]/item)); 
     if(i==1) 
     return [ret] 
     else 
     return acc.concat([ret]) 
}) 
console.log(result) 
1

您可以使用单个reduce并将项目映射到新数组。

var data = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]], 
 
    result = []; 
 

 
data.reduce((a, b) => (result.push(a.map((c, i) => b[i]/c)), b)); 
 

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