应用脚本的绑定方式因输入源而异



我有以下代码,它充当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;
}

最新更新