我有一个这样的数组,我希望count
每个元素的频率
var arr = [1, 5, 7, -1];
function countArray (arr){
var map = [];
for (var i =0; i < arr.length ; i++){
map[arr[i]]++;
}
console.log(map);
}
console.log
打印[1: NaN, 5: NaN, 7: NaN, -1: NaN]
我希望它能打印[1: 1, 5: 1, 7: 1, -1: 1]
我不明白为什么我会NaN
答案 0 :(得分:4)
好吧,如果它是第一次出现,那么你会尝试增加一个未定义的。因此,首先检查它是否未定义,然后分配0,或增加它。
你应该使用Object,而不是数组。该对象具有key
和value
,而Array
是一组有序的元素,可通过其数字索引访问。
我正在对此进行编辑,以解释您可以使用Array
对象。如果索引的值大于数组中的最大索引,则将调整其大小。但是,我认为使用Object会更好,因为将来如果你使用其他类型的密钥(不是数字),那么代码就不需要进行任何更改。
var arr = [1, 5, 7, -1];
function countArray (arr) {
var map = {};
for ( var i =0; i < arr.length ; i++ ){
map[ arr[i] ] = typeof map[ arr[i] ] === 'undefined' ? 1 : ++map[ arr[i] ];
}
console.log(map);
}
答案 1 :(得分:2)
你的功能还可以,但你可以用array.reduce一个衬垫来实现:
var arr = [1, 5, 7, -1, 1,1];
var r = arr.reduce((ac, x) => { if (!ac[x]) ac[x] = 0; return ac[x]++, ac},{});
document.write(JSON.stringify(r))
选择你觉得更具可读性的东西..
答案 2 :(得分:2)
更多explanatory version (JSBin) with reduce:
var arr = [1, 5, 7, -1];
var count = arr.reduce(function(obj, next) {
obj[next] = ++obj[next] || 1;
return obj;
}, {});
答案 3 :(得分:0)
您应该检查数组是否已包含密钥,您可以使用“in”来执行此操作。
var arr = [1, 5, 7, -1, -1];
function countArray (arr){
var map = [];
for (var i =0; i < arr.length ; i++){
if (arr[i] in map) map[arr[i]]++;
else map[arr[i]] = 1;
}
console.log(map);
}
countArray (arr)
输出:
[1:1,5:1,7:1,-1:2]