我正在为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);
答案 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]