如何减少数组的数值,跳过字符串

How to reduce array's numeric values, skipping strings

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

+---------+---------+---------+---------+
|         |  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   |
+---------+---------+---------+ 

我有这段代码,如果我在仅由数字组成的 table 上使用它,它就可以工作。问题是我的 table 里面有字符串,所以 .reduce returns 是 #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')

下面的示例怎么样?您可以在 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]]