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

07-28 07:46