为了账号安全,请及时绑定邮箱和手机立即绑定

基于索引的组和平均数组值

基于索引的组和平均数组值

三国纷争 2019-04-18 14:15:44
我有一个包含字符串和整数的二维数组。在GAS中,我想创建一个新数组,该数组平均具有公共字符串的数组的整数。我已经找到了解决方案,但我发现的大部分内容都是在ES6上,GAS不支持,其余的我无法适应我的情况。我试图使用map,reduce和filter但我找不到合适的解决方案。下面是数组和所需输出的示例。function myfunction(){var array = [["House1", 1.0, 2.0, 5.0, 1.0], ["House1", 1.0, 4.0, 2.0, 3.0], ["House2", 2.0, 3.0, 3.0, 4.0], ["House2", 5.0, 4.0, 3.0, 4.0],["House2", 4.0, 5.0, 2.0, 2.0], ["House3", 2.0, 1.0, 4.0, 5.0]]}//Desired outputvar newArray = [["House1", 1.0, 3.0, 3.5, 2.0],["House2", 3.6, 4.0, 2.6, 3.3],["House3", 2.0, 1.0, 4.0, 5.0]]
查看完整描述

4 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

let array = [

  ["House1", 1.0, 2.0, 5.0, 1.0],

  ["House1", 1.0, 4.0, 2.0, 3.0],

  ["House2", 2.0, 3.0, 3.0, 4.0],

  ["House2", 5.0, 4.0, 3.0, 4.0],

  ["House2", 4.0, 5.0, 2.0, 2.0],

  ["House3", 2.0, 1.0, 4.0, 5.0]];


let averageArrays = arrays =>

    arrays.reduce((sum, a) => {

      a.forEach((v, i) => sum[i] = (sum[i] || 0) + v / arrays.length);

      return sum;

    }, []);


let grouped = array.reduce((acc, a) => {

  acc[a[0]] = acc[a[0]] || [];

  acc[a[0]].push(a.slice(1));

  return acc;

}, {});


let averages = Object.entries(grouped).map(([name, arrays]) => [name, ...averageArrays(arrays)]);


console.log(averages);


查看完整回答
反对 回复 2019-05-17
?
MMTTMM

TA贡献1869条经验 获得超4个赞

以下代码在GAS环境中进行了测试。


function myFunction() {

  var array = [

    ["House1", 1.0, 2.0, 5.0, 1.0], 

    ["House1", 1.0, 4.0, 2.0, 3.0], 

    ["House2", 2.0, 3.0, 3.0, 4.0], 

    ["House2", 5.0, 4.0, 3.0, 4.0],

    ["House2", 4.0, 5.0, 2.0, 2.0], 

    ["House3", 2.0, 1.0, 4.0, 5.0]

  ];


  var avg = {}, count = {};

  array.forEach(function(a) {

    var key = a.shift();

    if (avg[key]) {

      for (var i = 0; i < 4; i++) { 

        avg[key][i] += a[i];

      }

      count[key]++;

    } else {

      avg[key] = a;

      count[key] = 1;

    }

  });


  var result = [];

  for (var key in avg) {

    for (var i = 0; i < 4; i++) { 

      avg[key][i] /= count[key];

    }

    avg[key].unshift(key);

    result.push(avg[key]);

  }


  Logger.log(result);

}

可能是,它很长,但每一步都很清楚。我们在avg和count对象中累积中间结果,根据需要将其转换为结果数组。


查看完整回答
反对 回复 2019-05-17
  • 4 回答
  • 0 关注
  • 461 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号