5

我有一个对象menuNames应该维护一个菜单项列表。如果menuNames已经有slug,则增加值,如果它不包含slug,则将值设置为1。我这样做是为了跟踪唯一名称。我想最终得到类似的东西:

menuNames: {
    home: 1,
    products: 10,
    contact: 1
}

这不起作用(这将包含在遍历每个 slug 的循环中):

menuNames[slug] = (menuNames.hasOwnProperty(slug) ? menuNames[slug]++ : 1);
//this sets every value to 1

但这确实有效(这将包含在遍历每个 slug 的循环中):

if(menuNames.hasOwnProperty(slug)) {
    menuNames[slug]++;
} else {
    menuNames[slug] = 1;
}
4

3 回答 3

8

menuNames[slug]++增加值,但返回原始值。

您正在执行menuNames[slug] =,因此该值在递增后被设置回原始值。

要修复它,只需执行以下操作:

menuNames[slug] = (menuNames.hasOwnProperty(slug) ? menuNames[slug]+1 : 1);

或者:

(menuNames.hasOwnProperty(slug) ? menuNames[slug]++ : menuNames[slug] = 1);
于 2013-02-08T16:49:18.460 回答
3

我想它可以像这样工作:

menuNames[slug] = (menuNames.hasOwnProperty(slug) ? ++menuNames[slug] : 1);
于 2013-02-08T16:49:32.177 回答
2

正如其他答案所说,问题出在后期增量中。

另一种写法是:

menuNames[slug] += (some_bool ? 1 : 0);

++对错误非常敏感。试着把它写成一个+=陈述。


如果menuNames[slug]可以未定义,则将其写为:

menuNames[slug] = 0;
if (some_bool) {
    menuNames[slug] += 1;
}

这是(在我看来)编写初始化/计数器循环的最清晰的方法。

如果你喜欢单行代码,你会畏缩,但如果你喜欢无错误代码,你会很高兴看到这一点。

于 2013-02-08T16:52:50.837 回答