我有一个国家/地区名称数组,我想创建名称的二维数组,并计数。我拥有的阵列是,
names = [Afghanistan,Alaska,Alaska,Alaska,Alaska,Alaska,Argentina,Argentina,British Virgin Islands,British Virgin Islands]
所以我想要二维数组中每个国家的数量。例如,我需要这样的东西
country['Afghanistan, 1]
country['Alaska, 5]
country['Argentina, 2]
等等。
请有人帮忙。感谢
答案 0 :(得分:1)
这就是你要求的:
var nameCounts = {};
for(var i = 0; i < names.length; i++) {
if(names[i] in nameCounts) {
nameCounts[names[i]]++;
} else {
nameCounts[names[i]] = 1;
}
}
var country = [];
for(var name in nameCounts) {
country.push([name, nameCounts[name]]);
}
虽然如果我是你,我会在填写nameCounts
后停止,这是一张从名字到伯爵的地图。
此外,如果您知道名称按字母顺序排列,则可以对此进行优化,如您的示例所示。
答案 1 :(得分:0)
怎么样:
names = ["Afghanistan","Alaska","Alaska","Alaska","Alaska","Alaska","Argentina","Argentina","British Virgin Islands","British Virgin Islands"];
function countWords(o,n){
o[n]=(o[n])?o[n]+1:1;
return o;
};
function makeTuples(obj){
var tuples=[];
for(var i in obj){
tuples.push([i, obj[i]])
}
return tuples;
}
console.log(makeTuples(names.reduce(countWords, {})))
以下是Fiddle。
有关Array.reduce()
的文档,请查看MDN。
不支持Array.reduce()
的较旧浏览器应与UnderscoreJs
答案 2 :(得分:0)
这是另一种直接创建结果数组的方法:
function getNamesCount(a) {
var nameIndex = {};
var results = [];
for (var i=0, iLen=a.length, name; i<iLen; i++) {
name = a[i];
if (!nameIndex.hasOwnProperty(name)) {
nameIndex[name] = results.length;
results.push(name, 0);
}
results[nameIndex[name] + 1] += 1;
}
return results;
}