我有以下代码,它充当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,给b表示1,给c表示1。显然,它仅识别第一个实例。
当我在countInstances中记录if-condition时,我可以学习两件事:1)仅将第一个实例视为TRUE,2)前四次elem仍为“ a”,并且list也是我所看到的数组,这意味着比较的评估似乎不正确,但我不知道为什么。
当我返回代码并将注释中“这里”的行中的“ elems [i]”更改为“ a”时,例如,再次返回正确的a数。这是我得出结论,将值移交给子功能时,发生了一些奇怪的绑定。
编辑
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;
}