如何减少数组的数值,跳过字符串
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]]
使用 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]]