2014-09-29 73 views
2

我正在爲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

通過數組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) 
} 
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++; 
    } 
+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

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/

+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

相關問題