【问题标题】:How to reduce array's numeric values, skipping strings如何减少数组的数值,跳过字符串
【发布时间】:2017-06-12 16:57:19
【问题描述】:

使用 Google Sheets 的脚本编辑器,我需要计算如下表的 每一列的平均值

+---------+---------+---------+---------+
|         |  User 1 |  User 2 |  User 3 |
+---------+---------+---------+---------+
|         | 20/1/17 | 21/1/17 | 22/1/17 |
+---------+---------+---------+---------+
| Movie 1 |    6    |    2    |    0    |
+---------+---------+---------+---------+  
| Movie 2 |    2    |    1    |    5    | 
+---------+---------+---------+---------+
| Movie 3 |    3    |    1    |    2    | 
+---------+---------+---------+---------+

我希望结果是:

+---------+---------+---------+
|  User 1 |  User 2 |  User 3 |
+---------+---------+---------+   
|   3.6   |   1.3   |   2.3   |
+---------+---------+---------+ 

我有这个代码,如果我在仅由数字组成的表格上使用它,它就可以工作。问题是我的表中有字符串,所以 .reduce 返回 #NUM!错误(结果不是数字)。

var sum = array.reduce(function(r, e, i) {
  e.forEach(function(a, j) {
    r[j] = (r[j] || 0) + a
  })
  if (i == array.length - 1) r = r.map(function(el) {
    return el / array.length
  });
  return r;
}, []);

return sum;

如何仅使用数值执行平均值?我尝试使用 .filter,但它似乎不适用于 Google Apps 脚本编辑器,或者我只是使用错误(很有可能)。

这是我用来过滤的条件:

(typeof el !== 'number')

【问题讨论】:

  • 您的数据是否可以从数组中删除前两项或在 foreach 中跳过它们而不进行测试?基本上从应该是第一行的行开始,if (r < 2) return;

标签: arrays google-apps-script google-sheets filter reduce


【解决方案1】:

下面的示例怎么样?您可以在 Google Apps 脚本上使用它。

var array = [
            [,, 'User 1', 'User 2', 'User 3'],
            ['Movie 1', '20/1/17', 6.0, 2.0, 5.0],
            ['Movie 2', '21/1/17', 2.0, 0.0, 2.0],
            ['Movie 3', '22/1/17', 3.0, 1.0, 3.0]
            ];

var sum = array.reduce(function(r, e, i) {
  e.forEach(function(a, j) {
      r[j] = (parseInt(r[j]) || 0) + a;
  })
  if (i == array.length - 1) r = r.map(function(el) {
    return isFinite(el) ? el : "";
  });
  return r;
}, []);
return [array[0].splice(2, 3), [x for each (x in sum)].splice(2, 3)];

>>> [[User 1, User 2, User 3], [11.0, 3.0, 10.0]]

【讨论】:

  • 非常感谢田池。这几乎是我需要的,除了我写错了表格(对不起),并且日期实际上与用户在同一列上(现在已修复),所以它们被添加到总和中(我想这是因为parseInt,但没有它我无法让它工作)。
  • 对不起。从您修改的表中,我没有找到 [3.6, 1.3, 2.3] 的结果的逻辑。所以我无法更新我的示例脚本。可以问一下逻辑吗?
  • 每列的平均值。所以第一列 [6, 2, 3] 是 (6+2+3)/3 = 3.5。所以首先我需要对它们求和(就像你在脚本中所做的那样),然后将它们除以行数。
  • 好吧,没关系。我刚刚删除了日期行,现在您的解决方案有效:) 谢谢!
猜你喜欢
  • 2014-11-15
  • 2022-01-13
  • 2022-01-01
  • 2021-12-07
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多