我有以下代码,它充当 Google 电子表格的自定义函数:
// counts the instances of elem in an array called list
function countInstances(elem, list) {
var p = 0;
for (var i = 0; i < list.length; i++) {
if (list[i] == elem) p++;
}
return p
}
function J(E) {
//var E = ["a","a","a","a","b","b","b","b","c","c","c","c"];
var elems = E.getUnique();
var b;
return countInstances(elems[0], E);
}
这看起来很简单,但奇怪的事情发生了:
- 当我在代码中取消注释“var E”时,b 返回我期望的结果:a 为 4,b 为 4,c 为 4,即数组中每个字符的实例数
- 当我没有将 E 硬编码到代码中,而是使用对电子表格的引用时,b 为我提供 1 表示 a、1 表示 b、1 表示 c。显然,它只识别第一个实例。
- 当我在 countInstances 中记录 if 条件时,我可以学到两件事:1)只有第一个实例被认为是 TRUE,2)前四次 elem 仍然是“a”,并且 list 也是我所看到的数组它,这意味着比较的评估似乎不对,但我不知道为什么。
- 当我返回代码并将注释中“here”所在行的“elems[i]”更改为“a”时,例如,再次返回正确的 a 数量。这是我得出的结论,当值被移交给子函数时,发生了一些奇怪的绑定(bind)。
编辑
getUnique 函数
Array.prototype.getUnique = function(){
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i){
if(u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
编辑2:
您可以找到电子表格示例 here .
最佳答案
编辑:如果您想直接在电子表格中将其用作自定义公式 ( example spreadsheet ),则此函数有效:
function J(E) {
var list = [];
for (var i = 0; i < E.length; i++)
{
list.push(E[i][0]);
}
var elems = list.getUnique();
for (var i = 0; i < elems.length; i++) {
var b = countInstances(elems[i], list); //here
}
return b;
}
关于javascript - Apps 脚本根据输入源进行不同的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167034/