同时创建 属性 和增加值

Simultaneously creating property and incrementing value

我是新手,所以如果这是一个愚蠢的问题,我深表歉意,我很抱歉在我的问题前先道歉。

我正在尝试计算数组中的值并将它们分类到以每个值命名的属性中。

这是我写的原代码:

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:南, 3:南, 5:南, 7:南, 9: 南 }

令我感到奇怪的是,如果我不包含“++”,则根本不会创建属性。

我确定如果 属性 已经有一个值,只要它不是未定义的,++ 就可以正常工作。但是,我显然不能每次循环都将值设置为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);

但它只是出现了一个错误。

我做错了什么?

如果 属性 未定义,您可以使用 || 运算符得到零,然后将其加 1 并存储在 属性:

reps[num] = (reps[num] || 0) + 1;

你在第二个代码中得到一个错误,因为你在 sortReps 中使用 series,但是参数是名称 ser,所以它是未定义的。此外,您创建了一个全局变量 num 并使用了未定义的 nume,并且它缺少右括号。无论如何,sortReps 函数除了不起作用之外,与 createReps 的作用相同,因此拥有两个函数不会改变任何东西。添加更多的 NaN 仍然会给你 NaN.

在 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 }

当该位置的原始值为 undefined 时,您无法执行 reps[num]++。您将得到 NaN(不是数字)。您需要这样做:

reps[num] = (reps[num]||0)+1;

它将使用现有值,或者当项目未定义时为 0,然后向其添加 1。