考虑数组的长度,求出数组的相应索引值

时间:2018-08-16 19:54:18

标签: javascript arrays loops

我有一个多维数组,其中包含不同长度的数组。 我想平均所有数组的相应索引值。 对于没有索引的数组,在对这些值求平均值时将不考虑该值。

var multiArray = [
  [4, 1, 3],
  [6, 4, 2, 3, 4],
  [8, 6, 1, 2],
  [2, 3]
];

var avgIdxArray = [];

// logic helper
// (4 + 6 + 8 + 2) / 4 = 5
// (1 + 4 + 6 + 3) / 4 = 3.5
// (3+ 2 +1) / 3 = 2
// (3 + 2) / 5 = 2.5
// 4 / 1 = 4;

// (sum of index values) / number of arrays that have those index

// desired output
console.log(avgIdxArray);
// [5, 3.5 ,2 ,2.5 ,4]

是否可以使用.map().filter().reduce()方法来实现?还有什么是处理此问题的最有效方法?

3 个答案:

答案 0 :(得分:1)

一个解决方案是这样:

1-multiArray数组转换为其垂直类型(如您所说的那样,新建具有索引的数组)

2-计算每个数组的sum,然后计算avg

var multiArray = [
    [4, 1, 3],
    [6, 4, 2, 3, 4],
    [8, 6, 1, 2],
    [2, 3]
  ],
  target = [];

multiArray.map((itm) => {
  let x = Object.keys(itm);
  x.forEach((ii) => {
    if (target.length <= ii) {
      target.push([]);
    }
    target[ii].push(itm[ii])
  });

});

target.forEach((arr)=> {
  let sum = arr.reduce(function(a, b) { return a + b; });
  let avg = sum / arr.length;
  console.log(avg)
})

答案 1 :(得分:0)

使用Array.reduce()迭代数组。用Array.forEach()迭代子数组,并收集总和以及索引中的项数。使用Array.map()将每个总和/计数对象转换为平均值:

const multiArray = [
  [4, 1, 3],
  [6, 4, 2, 3, 4],
  [8, 6, 1, 2],
  [2, 3]
];

const result = multiArray
  .reduce((r, a) => {
    a.forEach((n, i) => {
      const { sum = 0, count = 0 } = r[i] || {};
      
      r[i] = { sum: sum + n, count: count + 1 };
    });
    
    return r;
  }, [])
  .map(({ sum, count }) => sum / count);
  
console.log(result);

答案 2 :(得分:0)

纯mapreduce。

Object.keys(multiArray.sort( (x,y) => y.length - x.length)[0]).
map( x => Object.keys(multiArray).
map(y => x < multiArray[y].length?multiArray[y][x]:undefined)).
map( a => ({sum: (a.reduce((l,r) => (l?l:0) + (r?r:0))), length: (a.filter(x => x).length)}) ).
map( pair => pair.sum / pair.length)

输出 [5,3.5,2,2.5,4]

要去那里很多。让我们一步一步来

 var multiArray = [
...   [4, 1, 3],
...   [6, 4, 2, 3, 4],
...   [8, 6, 1, 2],
...   [2, 3]
... ];

对数组进行排序,以使具有最多元素的数组排在第一位

multiArray.sort( (x,y) => y.length - x.length)

[[6,4,2,3,4],[8,6,1,2],[4,1,3],[2,3]]

获取第一个元素并遍历其键。这是我们之前排序过的最大元素。

Object.keys(multiArray.sort( (x,y) => y.length - x.length)[0])

['0','1','2','3','4']

现在检查是否所有数组都具有该键,否则将未定义的键放在那儿

Object.keys(multiArray.sort( (x,y) => y.length - x.length)[0]).
map( x => Object.keys(multiArray).
map(y => x < multiArray[y].length?multiArray[y][x]:undefined)).

[ [ 6, 8, 4, 2 ],
  [ 4, 6, 1, 3 ],
  [ 2, 1, 3, undefined ],
  [ 3, 2, undefined, undefined ],
  [ 4, undefined, undefined, undefined ] ]

创建一个具有总和和长度的对象。这部分是可选的,但是我希望这很清楚

Object.keys(multiArray.sort( (x,y) => y.length - x.length)[0]).
map( x => Object.keys(multiArray).
map(y => x < multiArray[y].length?multiArray[y][x]:undefined)).
map( a => ({sum: (a.reduce((l,r) => (l?l:0) + (r?r:0))), length: (a.filter(x => x).length)}) )

[ { sum: 20, length: 4 },
  { sum: 14, length: 4 },
  { sum: 6, length: 3 },
  { sum: 5, length: 2 },
  { sum: 4, length: 1 } ]

最后获得平均值

Object.keys(multiArray.sort( (x,y) => y.length - x.length)[0]).
map( x => Object.keys(multiArray).
map(y => x < multiArray[y].length?multiArray[y][x]:undefined)).
map( a => ({sum: (a.reduce((l,r) => (l?l:0) + (r?r:0))), length: (a.filter(x => x).length)}) ).
map( pair => pair.sum / pair.length)

[ 5, 3.5, 2, 2.5, 4 ]