同时创建属性和递增值

时间:2015-04-13 22:38:18

标签: javascript object properties

我是新来的,所以如果这是一个愚蠢的问题,我道歉,我道歉地向我的问题提出道歉。

我正在尝试计算数组中的值,并将它们排序为为每个值命名的属性。

这是我写的原始代码:

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);

但它只是出现错误。

我做错了什么?

3 个答案:

答案 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。