对另一个数组给定值的数组计数发生

问题描述:

我正在为Google Spreadsheet编写一个脚本。对另一个数组给定值的数组计数发生

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

John, Pete, Paul, ... Michael 

阵列2是一系列从给定的50那些重复的名称(10K以上合计)

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

如何在数组1中为每个给定名称创建另一个具有数量(Array 2)的数组?

排序是不可能的。因此,阵列3应该考虑到阵列的顺序1.在这种情况下,例如:

1, 2, 3,... 4 

我见过&证明如何使它如果顺序并不重要(从Array 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); 
+0

你真的需要一个脚本来做到这一点?你可以简单地使用一个计数公式或者一个数据透视表的更复杂的分析? – Harold 2014-09-30 15:46:55

通过数组2步行街和与每一个键的名称和值作为其出现次数的数量建立一个对象。

例如

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) 
} 

您需要在第二个使用不同的变量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++; 
    } 
+0

好眼睛。我完全错过了'我'被用于两个循环。 'count'被推送为'[count]',所以如果不需要这个包装数组,也可能是一个问题。 – 2014-09-29 15:09:49

+0

对,他可能打算这样做。不确定。然而,循环实际上是关闭的。 'if'语句不使用大括号。 :) – 2014-09-29 15:16:19

+0

是的,我注意到后来并删除了我的评论,因为我是一个混蛋。但是,是的,我不知道他到底想要什么,所以我把它放在一边。 xP – 2014-09-29 15:21:44

// 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/

+0

杰克和辛迪是船员的第13和第14名成员;) – 2014-09-29 15:27:57

+0

@RyanWheale哈哈我不明白,你是什么意思? – 2014-09-29 15:31:59

+0

其中大部分都是门徒的名字......其中有12名。虽然迈克尔和保罗不是门徒,但我只是觉得很有趣,你没有坚持圣经的范式。 – 2014-09-29 15:36:02