在javascript中计算数组中元素的出现次数

时间:2016-04-28 22:24:55

标签: javascript

我有一个这样的数组,我希望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

4 个答案:

答案 0 :(得分:4)

好吧,如果它是第一次出现,那么你会尝试增加一个未定义的。因此,首先检查它是否未定义,然后分配0,或增加它。

你应该使用Object,而不是数组。该对象具有keyvalue,而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]