首页 > 解决方案 > 计算二维数组中的出现次数并将自定义公式结果放在数组末尾

问题描述

我有一个来自谷歌电子表格的二维数组,例如:-

在此处输入图像描述

请注意,二维数组的长度和宽度可以是任意大小。但是,计数总是从第二个 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]]

标签: javascriptgoogle-apps-script

解决方案


首先,创建一个计数函数,用于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);


推荐阅读