计算给定另一个数组的值的数组中的出现次数

时间:2014-09-29 14:58:09

标签: javascript arrays google-sheets

我正在为Google电子表格编写一个脚本。

数组1有一系列名称(超过50个不同的名称)

John, Pete, Paul, ... Michael

数组2是一系列重复的名称,来自50(总共超过10K)

Paul, Michael, Pete, John, Paul, Paul, Pete, Michael, Paul, Michael,... Michael

如何为阵列1中的每个给定名称创建另一个具有出现次数(数组2)的数组?

无法进行排序。因此,Array 3应该考虑数组1的顺序。在这种情况下,例如:

1, 2, 3,... 4

我见过&如果顺序不重要,证明了如何制作它(从数组2开始,数组1使用唯一名称创建,数组3包含它们的出现 - > Counting the occurrences of JavaScript array elements),但我的所有方法似乎都没有工作。到目前为止,我有这个:

var namesCountArray = [];
namesArray = ss.getRange("CU3:CU" + rows + "").getValues();
namesSerieArray = ss.getRange("DF3:DF" + rows + "").getValues();

for(var i=0; i< namesArray.length; i++) {
    var count = 0;
    for(var i = 0; i < namesSerieArray.length; ++i) {
        if(namesSerieArray[i] == namesArray[i])
            count++;
    }
    namesCountArray.push([count]);
}
ss.getRange("DB3").setValue(namesCountArray);

3 个答案:

答案 0 :(得分:3)

你需要在第二个for循环中使用另一个变量或者将它们全部一起取出:

for(var i=0; i< namesArray.length; i++) {
  var count = 0;
  for(var i = 0; i < namesSerieArray.length; ++i){
  if(namesSerieArray[i] == namesArray[i])
    count++;
  }

你要经历并检查每对1与1,2只有2,3与3只。如果要检查每个索引对,则应该执行单独的变量(1表示1,1表示2 ...)。例如:

for(var i=0; i< namesArray.length; i++) {
  var count = 0;
  for(var j = 0; j < namesSerieArray.length; j++){
  if(namesSerieArray[i] == namesArray[j])
    count++;
  }

答案 1 :(得分:2)

遍历array2并使用每个键作为名称构建一个对象,并将值作为其出现次数。

e.g。

var array2 = ["Paul", "Michael", "Pete", ... /* 47 more names */ ];
var occurences = {};

for (var i = 0, l = array2.length; i++; i<l) {
   if (occurences[array2[i]] === undefined) {
     occurences[array2[i]] = 1;
   }
   else {
     occurences[array2[i]]++;
   }
}

然后遍历第一个数组,检查名称是否在对象occurences中并将其值推送到新数组中,如此

var array1 = ["Paul", "Michael", "Pete", "John", "Steve", "Bill" ];
var array1Frequency = [];

for (var i = 0, l = array1.length; i++; i<l) {
    array1Frequency.push(occurences[array1[i]] || 0)
}

答案 2 :(得分:1)

// names we want to find
var names = ["john", "pete", "paul"];

// target list of names.
// john, pete, paul appear 2x
var target = ["john", "pete", "jack", "cindy", "thomas", "paul", "john", "pete", "paul"];

function finder(search, target) {
    return search.map(function (val) {
        return target.filter(function (e) {
            return val === e;
        }).length;
    });
}

finder(names, target);
// => [2, 2, 2]

演示: http://jsfiddle.net/austinpray/v14o38ta/