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

在javascript中计算数组中元素的出现次数,javascript,Javascript,我有一个这样的数组,我想计算每个元素的频率 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); } var-arr=[1,5,7,-1]; 函数计数数组(arr){ var-map=[]; 对于(变量i=0;i

我有一个这样的数组,我想计算每个元素的频率

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);  
}
var-arr=[1,5,7,-1];
函数计数数组(arr){
var-map=[];
对于(变量i=0;i
console.log
打印
[1:NaN,5:NaN,7:NaN,-1:NaN]

我希望它能打印
[1:1,5:1,7:1,-1:1]


我不明白为什么我得到了
NaN

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

您应该使用对象,而不是数组。对象有一个
,而
数组
是一组有序的元素,通过它们的数字索引访问

我编辑这篇文章是为了解释您可以使用
数组
对象。如果索引的值大于数组中的最大索引,则将调整其大小。但是,我认为使用对象更好,因为将来如果使用其他类型的键(而不是数字),那么代码将不需要任何更改

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);  
}
var-arr=[1,5,7,-1];
函数计数数组(arr){
var-map={};
对于(变量i=0;i
好吧,如果这是第一次发生,那么您将尝试增加一个未定义的值。因此,首先检查它是否未定义,然后分配0,或递增它

您应该使用对象,而不是数组。对象有一个
,而
数组
是一组有序的元素,通过它们的数字索引访问

我编辑这篇文章是为了解释您可以使用
数组
对象。如果索引的值大于数组中的最大索引,则将调整其大小。但是,我认为使用对象更好,因为将来如果使用其他类型的键(而不是数字),那么代码将不需要任何更改

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);  
}
var-arr=[1,5,7,-1];
函数计数数组(arr){
var-map={};
对于(变量i=0;i
您应该检查数组是否已经包含密钥,您可以使用“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)
var-arr=[1,5,7,-1,-1];
函数计数数组(arr){
var-map=[];
对于(变量i=0;i
输出:

[1:1,5:1,7:1,-1:2]


您应该检查数组是否已经包含密钥,您可以使用“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)
var-arr=[1,5,7,-1,-1];
函数计数数组(arr){
var-map=[];
对于(变量i=0;i
输出:

[1:1,5:1,7:1,-1:2]


你的函数很好,但你可以用数组来实现。减少一行:

var-arr=[1,5,7,-1,1,1];
var r=arr.reduce((ac,x)=>{if(!ac[x])ac[x]=0;返回ac[x]++,ac},{});

document.write(JSON.stringify(r))
您的函数很好,但可以使用数组来完成。减少一行代码:

var-arr=[1,5,7,-1,1,1];
var r=arr.reduce((ac,x)=>{if(!ac[x])ac[x]=0;返回ac[x]++,ac},{});
document.write(JSON.stringify(r))
使用reduce进行更多操作:

var arr = [1, 5, 7, -1];    

var count = arr.reduce(function(obj, next) {
  obj[next] = ++obj[next] || 1;
  return obj;
}, {});
A更多关于减少:

var arr = [1, 5, 7, -1];    

var count = arr.reduce(function(obj, next) {
  obj[next] = ++obj[next] || 1;
  return obj;
}, {});

在执行
++
之前,需要将值初始化为
0
。否则,您将执行
null+1
,这是NaN(不是数字)。您可以通过在
for
循环的开头添加以下内容来解决此问题:
如果(!map.hasOwnProperty(arr[i]){map[arr[i]]=0;}
@JoshKG我是一个学习编程的单身妈妈。对不起,糟糕的“乐高电影”笑话:)在执行
++
之前,您需要将值初始化为
0
。否则,您将执行
null+1
,这是NaN(不是数字)。你可以在你的
for
循环的开头加上:
如果(!map.hasOwnProperty(arr[i]){map[arr[i]=0;}
@JoshKG我是一个学习编程的单亲妈妈。对不起,糟糕的“乐高电影”笑话:)我只是在这里放了一行,这样你就不会孤单了:
xs.reduce((acc,x)=>Object.assign(acc,{[x]:(acc[x];(acc[x]|0) + 1 }), {});
除非另有规定,否则在回答类似问题时请使用ES5语法,以实现最大的浏览器兼容性。箭头函数(在ECMAScript 2015中引入)还不受所有主流浏览器的支持(例如IE11,它是Windows 7上可用的IE的最高版本,目前仍在广泛使用)。我在这里只写了一行代码,这样你就不会孤单:
xs.reduce((acc,x)=>Object.assign(acc,{[x]:(acc[x]| 0)+1})
除非另有规定,否则在回答类似问题时请使用ES5语法,以实现最大的浏览器兼容性。箭头功能(随ECMAScript 2015引入)尚未得到所有主流浏览器的支持(例如,IE11,它是Windows 7上可用的IE的最高版本,目前仍在广泛使用)。或者:
map[arr[i]=(map[arr[i]]|0)+1
。或者:
map[arr[i]=(map[arr[i]|0)+1
。如果使用的元素与对象原型中的属性名称匹配,则会导致问题。如果您正在
中使用
,则应通过执行
hasOwnProperty
检查来过滤结果。鉴于OP只是在学习,我也不建议您使用条件语句的“内联”样式。如果使用的元素与对象原型中的属性名称匹配,这将导致问题。如果您在