2017-01-31 3 views
1

配列のハッシュoがあるとします。各イベントが0以上のコールバックを持つことができるイベントの登録済みコールバックなどです。配列を1つの要素で初期化するか、配列が存在する場合に要素をpushする

これをES6でよりうまく表現する方法はありますか?

if (key in o) o[key].push(x); else o[key] = [x] 

「良い」とは、他の開発者がより理解しやすいという意味です。おそらくより簡潔ですが、読みやすさを犠牲にするものではありません。特定の(共通の)問題は、oがしばしばより長い表現であることです。 this.listeners、それを3回繰り返すことは最適ではないようです。実際のコードは次のようになります。

if (event in this.listeners) 
    this.listeners[event].push(callback); 
else 
    this.listeners[event] = [callback]; 

答えて

6

必要に応じて論理ORを使用して配列を作成できます。これは一度だけo[key]を繰り返す

(o[key] = o[key] || []).push(x); 

o[key] = o[key] || []; 
o[key].push(x); 
+0

を – Jakob

0
try { 
    o[key].push(x) 
} 
catch(e) { 
    //cannot push to undefined exception 
    o[key] = [x] 
} 
+3

ああ男の子、例外を使用するのは、そのために**良い理由がある場合にのみ起こるはずです。ここには誰もいません... – KarelG

3

一つの解決策は、論理OR空の配列と共に使用し、得られた配列にプッシュすることです。

結果がo[key](o[key] = o[key] || [])割り当て全体の括弧に注意してください。

o[key] = (o[key] || []).push(x) pushは配列の新しい長さを返すため、不正確になります。

+0

それが動作している間に、かっこ内の割当てのため、最初の視界で誤読されがちです。 –

+1

@NinaScholz:JSではやや厄介です(主に '|| =' "デフォルト代入演算子"を持たないためです)。しかし、あなたがこのイディオムをよく知っていれば、それほど悪くはありません。多くのイディオムは、最初は不透明であるが、経験(例えば、ユビキタス '!!' "ブーリアライザー演算子")で読みやすくなっている。 – Amadan

+1

@Amadan、それは行の中の代入演算子の問題です。 –

0

次のようにすることもできます。パフォーマンスに大きな違いがあります。

o[key] = o[key] ? o[key].concat(x) : [x] 
o[key] ? o[key].push(x) : o[key] = [x] 
o[key] && o[key].push(x) || (o[key] = [x]) 
+0

これらは正しいが、私は 'o [key]'を可能な限り数回繰り返すことを望んでいる(2と思われる)。 –

1

ほとんど同じですが、あなたは配列初期化子の構文を使用でき(それは新しい配列を作成することを除いて)他の回答のように:これは最短が、最も読みやすい形式ではありません

o[key] = [...o[key] || [], x]; 
関連する問題