Javascript 计算二维数组中的出现次数,并将自定义公式结果放在数组末尾

Javascript 计算二维数组中的出现次数,并将自定义公式结果放在数组末尾,javascript,google-apps-script,Javascript,Google Apps Script,我有一个来自谷歌电子表格的2D数组,例如:- 请注意,2D阵列的长度和宽度可以是任意大小。但是,计数将始终以第二列1开始 var ss = SpreadsheetApp.openById('19xxxxxxxxxxxxxxxxxxxxxxxxUOI'); var sh=ss.getSheetByName("Sheet2"); var lastR = sh.getLastRow() var data = sh.getRange("A4:QC"+lastR).getValues(); 数据数组看

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

请注意,2D阵列的长度和宽度可以是任意大小。但是,计数将始终以第二列1开始

var ss = SpreadsheetApp.openById('19xxxxxxxxxxxxxxxxxxxxxxxxUOI');
var sh=ss.getSheetByName("Sheet2");
var lastR = sh.getLastRow()
var data = sh.getRange("A4:QC"+lastR).getValues();
数据
数组看起来像
[[alpha,a,a,b,c],[betea,b,b,a,a],[gama,a,b,c,c],[alpha,d,c,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]]

首先,创建一个计数函数,该函数用于计算子数组中每个元素的出现次数。然后,创建另一个函数,该函数使用计数结果根据公式计算值,然后将其推送到子数组。最后,将此函数应用于整个数组的每个元素(在本例中,它是就地完成的,但也可以通过创建新数组并使用以下命令来完成):

const count=(列表,els)=>{
常量acc={};
els.forEach(el=>{acc[el]=0;});
返回列表。减少((会计科目,当前)=>{
acc[curr]++;
返回acc;
},acc);
};
常量公式=列表=>{
常数{a,b,c,d}=计数(列表,['a','b','c','d']);
常数x=(a+c)/(b+d);
列表。推送(x);
};
常量数据=['alpha','a','a','b','c'],['beeta','b','a','a'],['gama','a','b','c','c'],['x-ray','d','c','a','a'];
数据。forEach(公式);

控制台日志(数据)首先,创建一个计数函数,用于对子数组中每个元素的出现次数进行计数。然后,创建另一个函数,该函数使用计数结果根据公式计算值,然后将其推送到子数组。最后,将此函数应用于整个数组的每个元素(在本例中,它是就地完成的,但也可以通过创建新数组并使用以下命令来完成):

const count=(列表,els)=>{
常量acc={};
els.forEach(el=>{acc[el]=0;});
返回列表。减少((会计科目,当前)=>{
acc[curr]++;
返回acc;
},acc);
};
常量公式=列表=>{
常数{a,b,c,d}=计数(列表,['a','b','c','d']);
常数x=(a+c)/(b+d);
列表。推送(x);
};
常量数据=['alpha','a','a','b','c'],['beeta','b','a','a'],['gama','a','b','c','c'],['x-ray','d','c','a','a'];
数据。forEach(公式);

控制台日志(数据)
如果
(b+d)
0
(如果有的话,除非
Infinity
在那里是可以接受的)?如果
(b+d)
0
(如果有的话,除非
Infinity
在那里是可以接受的)?它对大数据不起作用?有些我无法得到结果。您的代码工作正常,但我无法理解代码中的错误。奇怪的是,我意识到,我的实际值不是
a、b、c、d
,而是
S2/F、S1/F、S3/F、MSF
,这是代码无法读取的。可能是什么原因workaround@Mask你能再解释一下你的意思吗?也许有一些例子可以说明你到底在做什么,这样我就可以理解哪里出了问题。我从数组中删除了spechial字符“/”,然后应用了你的代码。它现在运行良好。它不适用于大数据。我无法获得结果。您的代码工作正常,但我无法理解代码中的错误。奇怪的是,我意识到,我的实际值不是
a、b、c、d
,而是
S2/F、S1/F、S3/F、MSF
,这是代码无法读取的。可能是什么原因workaround@Mask你能再解释一下你的意思吗?也许有一些例子可以说明你到底在做什么,这样我就可以理解哪里出了问题。我从数组中删除了spechial字符“/”,然后应用了你的代码。现在很好用。