javascript - 计算二维数组中的出现次数并将自定义公式结果放在数组末尾
问题描述
我有一个来自谷歌电子表格的二维数组,例如:-
请注意,二维数组的长度和宽度可以是任意大小。但是,计数总是从第二个 col1 开始。
var ss = SpreadsheetApp.openById('19xxxxxxxxxxxxxxxxxxxxxxxxUOI');
var sh=ss.getSheetByName("Sheet2");
var lastR = sh.getLastRow()
var data = sh.getRange("A4:QC"+lastR).getValues();
data
数组看起来像[[alpha,a,a,b,c],[beeta,b,b,a,a],[gama,a,b,c,c],[alpha,d,c,a,a]]
现在我想计算每一行中元素的出现次数,并将公式推到result
每列的末尾。
如果我的公式是(a+c)/(b+d)
从上面的例子中,结果是
(2+1)/(1+0) = 3 //occurrence in 1st row a=2,b=1,c=1,d=0
(2+0)/(2+0) = 1 //occurrence in 2nd row a=2,b=2,c=0,d=0
(1+2)/(1+0) = 3 //occurrence in 3rd row a=1,b=1,c=2,d=0
(2+1)/(0+1) = 3 //occurrence in 4th row a=2,b=0,c=1,d=1
现在结果应该在数组的末尾
[[alpha,a,a,b,c,3],[beeta,b,b,a,a,1],[gama,a,b,c,c,3],[alpha,d,c,a,a,3]]
解决方案
首先,创建一个计数函数,用于Array.prototype.reduce
计算子数组中每个元素的出现次数。然后,创建另一个函数,该函数使用计数结果根据公式计算值,然后将其推送到子数组。最后,将此函数应用于整个数组的每个元素(在这种情况下,它是就地完成的,但这也可以通过创建一个新数组并使用来完成Array.prototype.map
):
const count = (list, els) => {
const acc = {};
els.forEach(el => { acc[el] = 0; });
return list.reduce((acc, curr) => {
acc[curr]++;
return acc;
}, acc);
};
const formula = list => {
const { a, b, c, d } = count(list, ['a', 'b', 'c', 'd']);
const x = (a + c) / (b + d);
list.push(x);
};
const data = [['alpha', 'a', 'a', 'b', 'c'], ['beeta', 'b', 'b', 'a', 'a'], ['gama', 'a', 'b', 'c', 'c'], ['x-ray', 'd', 'c', 'a', 'a']];
data.forEach(formula);
console.log(data);
推荐阅读
- scala - 如何以格式化的方式打印数组数组?
- ios - 具有动态高度和半宽的 UICollectionview 单元格
- django - Haystack Django 一次搜索多个字段
- python - 如何根据特定规则标记系列中的值?
- java - 通过pojo获取firebase自动生成Id,我模型类的getter()方法返回null
- pandas - 无法在 Pandas 中填写空白值
- javascript - 在事件 onclick 中更改类值 javascript?
- javascript - 读取随机行 com 文件
- python - python'双重理解'列表到dict
- java - 如何在 Android 10 中打开活动(传入 voip 呼叫)