我有以下代码,它充当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 返回我希望它返回的内容:4 表示 a,4 表示 b,4 表示 c,即数组中每个字符的实例数
- 当我没有将 E 硬编码到代码中,而是使用对电子表格的引用时,b 给了我 1 表示 a,1 表示 b,1 表示 c。
- 当我在 countInstances 中记录 if 条件时,我可以学到两件事:1) 只有第一个实例被认为是 TRUE,2) elem 在前四次仍然是"a",列表也是我看到的数组,这意味着比较的评估似乎不对,但我不知道为什么。
- 当我返回代码并将注释中"这里"的行上的"elems[i]"更改为"a"时,例如,再次返回正确数量的 a。这就是我得出结论的地方,当值被移交给子函数时,发生了一些奇怪的绑定。
编辑
获取唯一函数
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:
您可以在此处找到示例电子表格。
编辑:如果您想直接在电子表格(示例电子表格)中将其用作自定义公式,则此功能有效:
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;
}