5

menuNamesメニュー項目のリストを維持するオブジェクトがあります。menuNamesがすでにある場合slugは、値を増やします。含まれていない場合はslug、値を に等しく設定します1。一意の名前を追跡するためにこれを行っています。私は次のようなものになりたい:

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

これは機能しません (これは各スラッグを通過するループに含まれます):

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

しかし、これは機能します (これは各スラッグを通過するループに含まれます):

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 に答える