用零填充对象

时间:2019-07-25 17:47:16

标签: javascript object initialization

我有一些函数可以计算数组中某些元素的数量:

let array = [5,1,2,3,4,7,2,1,2,3,4,5];

function countEntries(arr){
    let entries = {};

    arr.forEach(function (item) {
        entries[item] += 1;
    });

    console.log(entries);
}

但是未定义默认值,这就是我得到的:

{ '1': NaN, '2': NaN, '3': NaN, '4': NaN, '5': NaN, '7': NaN }

我试图在forEach内定义对象的属性:

arr.forEach(function (item) {
    entries[item] = 0;
    entries[item] += 1;
});

但是在这种情况下,该属性在每次迭代时都重置为零。如果我事先不知道对象属性的名称,该怎么办?

4 个答案:

答案 0 :(得分:1)

有条件地添加默认值(可以使用逻辑OR)

entries[item] = entries[item] || 0

let array = [5, 1, 2, 3, 4, 7, 2, 1, 2, 3, 4, 5];

function countEntries(arr) {
  let entries = {};

  arr.forEach(function(item) {
    entries[item] = entries[item] || 0;
    entries[item] += 1;
  });

  console.log(entries);
}

countEntries(array);

答案 1 :(得分:1)

或简单地:

let array   = [5,1,2,3,4,7,2,1,2,3,4,5]
,  entries = {}

for(let e of array) entries[e] = (entries[e]) ? (entries[e]+1) : 1


console.log( JSON.stringify(entries) )

答案 2 :(得分:1)

这是reduce的好用例:

const countEntries = array => 
  array .reduce ((a, n) => ({...a, [n]: (a[n] || 0) + 1}), {})

let array = [5, 1, 2, 3, 4, 7, 2, 1, 2, 3, 4, 5];

console .log (
  countEntries (array)
)

答案 3 :(得分:1)

您步入正轨!您只需将条件放入forEach中即可:

entries[item] ? entries[item] += 1 : entries[item]= 1;

表示该项目已在“ entries”对象中,然后增加编号(如果没有)-分配1。

完整代码为:

function countEntries(arr){
 let entries = {};

 arr.forEach(function (item) {
  entries[item] ? entries[item] += 1 : entries[item] = 1;
 });

 console.log(entries);
}