我是新来的,所以如果这是一个愚蠢的问题,我道歉,我道歉地向我的问题提出道歉。
我正在尝试计算数组中的值,并将它们排序为为每个值命名的属性。
这是我写的原始代码:
var reps = {};
function sortReps(series){
var num;
for (var i=0; i<series.length; i++) {
num = series[i];
reps[num]++;
}
}
var arr = [1,3,3,5,7,9,9,9];
sortReps(arr);
console.log(reps);
理想情况下,控制台会打印{ 1:1, 3:2, 5:1, 7:1, 9:3 }
但相反它打印 { 1:NaN, 3:NaN, 5:NaN, 7:NaN, 9:NaN }
对我来说奇怪的是,如果我不包含“++”,那么属性就永远不会被创建。
如果属性已经有值,我已经确定++可以正常工作,只要它没有未定义。但是,我显然无法在每次循环时将该值设置为0,否则它将无法用作计数器。
我甚至尝试添加另一个函数来在属性创建后为属性添加值:
var reps = {};
function createReps(series){
var num;
for (var i=0; i<series.length; i++) {
num = series[i];
reps[num]++;
}
}
function sortReps(ser){
var nume;
for (var j=0; j<series.length; j++) {
num = series[j];
reps[nume]++;
}
var arr = [1,3,3,5,7,9,9,9,42];
createReps(arr);
sortReps(arr);
console.log(reps);
但它只是出现错误。
我做错了什么?
答案 0 :(得分:0)
如果属性未定义,您可以使用||
运算符获取零,然后将1添加到该属性并存储在属性中:
reps[num] = (reps[num] || 0) + 1;
第二个代码中出现错误,因为您在series
中使用sortReps
,但参数是名称ser
,因此未定义。此外,您创建了一个全局变量num
并使用未定义的nume
,并且它是&#39;错过了一个结束括号。无论如何,除了不工作之外,sortReps
函数与createReps
的作用相同,因此它不会改变任何东西以具有两个函数。向NaN
添加更多内容仍会为您提供NaN
。
答案 1 :(得分:0)
在for循环中检查是否定义了reps[num]
,如果没有将其声明为0。
var reps = {};
function sortReps(series){
var num;
for (var i=0; i<series.length; i++) {
num = series[i];
if(reps[num] === undefined)reps[num]=0;
reps[num]++;
}
}
var arr = [1,3,3,5,7,9,9,9];
sortReps(arr);
console.log(reps); // { 1: 1, 3: 2, 5: 1, 7: 1, 9: 3 }
答案 2 :(得分:0)
当该位置的原始值为reps[num]++
时,您无法undefined
。您将获得NaN
(不是数字)。你需要这样做:
reps[num] = (reps[num]||0)+1;
它将使用现有值,或者在未定义项目时使用0,然后向其中添加1。