用零或增量初始化对象的更好方法是什么?

时间:2019-01-25 07:34:33

标签: javascript javascript-objects

我正在编写分析数据,我必须初始化小时,天,周,年的(键)计数器计数,以便获得用户活动的频率。我需要为各个时间创建一个点击计数,并相应地增加。访问是通过循环进行的。 我已经完成了这项工作,但是不确定下面的代码是否适合这样做。

if(!analytics.users[message.user].counts.hourly[hour]) {
    analytics.users[message.user].counts.hourly[hour] = 0;
}
analytics.users[message.user].counts.hourly[hour] += 1;

if(!analytics.users[message.user].counts.daily[day]) {
    analytics.users[message.user].counts.daily[day] = 0;
}
analytics.users[message.user].counts.daily[day] += 1;

...

我已经尝试过x = x + 1 || 0方法,但无效。 另外,有什么办法可以为此设置功能吗?

3 个答案:

答案 0 :(得分:2)

您可以使用接收对象和键并执行检查和更新的功能。

function increment(object, key) {
    if (!object[key]) object[key] = 0;
    ++object[key];
}

致电

increment(analytics.users[message.user].counts.hourly, hour);

答案 1 :(得分:1)

  

我已经尝试过x = x + 1 || 0

您几乎明白了。应该是:

x = x || 0;
x++;

x = x + 1 || 1;

因此,将您的代码更改为:

analytics.users[message.user].counts.hourly[hour] = 
    (analytics.users[message.user].counts.hourly[hour] + 1) || 1

如果未定义analytics.users[message.user].counts.hourly[hour],则增量操作将返回NaN。这是一个falsy值。因此,它需要1

答案 2 :(得分:0)

您可以创建一个简单的增量函数,如下所示。它首先检查要初始化的密钥,否则将其初始化为0。自从先前创建密钥以来,下一行具有增量的行就可以安全执行。

let message = {
  user: "user"
}

let analytics = {
  users: {
    "user": {
      counts: {
      }
    }
  }
}

function incrementAnalytics(analytics, period) {
  analytics[period] = analytics[period] || 0;
  ++analytics[period];
}

let test = analytics.users[message.user].counts;
incrementAnalytics(test, "hourly");
incrementAnalytics(test, "hourly");
incrementAnalytics(test, "daily");

console.log(test);

干杯!