質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

2134閲覧

配列内の特定の要素が未定義なら初期化してからpush、 定義済みならそのままpushという操作をスマートに書く方法

toromou

総合スコア30

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/02/13 04:29

配列の特定の要素が未定義なら初期化してからpush、
定義済みならそのままpushという操作をスマートに書く方法を考えています。
例えば以下のような場合です。

js

1const array = []; 2 3array[0] = ['0']; 4array[1] = ['1']; 5array[3] = ['3']; 6 7for (let i = 0; i <= 5; i++) { 8 if (array[i] === undefined) array[i] = []; 9 array[i].push('add'); 10} 11 12console.table(array); 13 14// while文実行後のarray配列 15// array = [ 16// ['0', 'add'], 17// ['1', 'add'], 18// ['add'], 19// ['3', 'add'], 20// ['add'], 21// ['add'], 22// ];

for文の中でarray[i]が3回もあって何だか冗長に見えます。
もっと簡潔な記述がありましたらご教授の程よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

for文の中でarray[i]が3回もあって何だか冗長に見えます。

個人的には、何をしているのかわかりやすくて悪くないと思いますけれども……

一応、スマート()に書いてみましたが、可読性はtoromouさんのコードの方が優れていると思います。

js

1for (let i = 0; i <= 5; i++) { 2 ( array[i] || ( array[i] = [] ) ).push('add'); 3}

###質問クローズを受けて追記

jun68yktさんなどが挙げたスプレッド演算子を使って代入する方法は、破壊的なので、元のコードと微妙に振る舞いが違います。
あまり変わったことをしていなければ問題ないとは思いますが、お気を付けください。

js

1const array = []; 2 3array[0] = ['0']; 4array[1] = ['1']; 5array[3] = ['3']; 6const old = array[3]; 7 8for (let i = 0; i <= 5; i++) { 9 array[i] = [...(array[i] || []), 'add']; 10} 11 12console.table(old === array[3]); // false 13 14const array_ = []; 15 16array_[0] = ['0']; 17array_[1] = ['1']; 18array_[3] = ['3']; 19const old_ = array_[3]; 20 21for (let i = 0; i <= 5; i++) { 22 if (array_[i] === undefined) array_[i] = []; 23 array_[i].push('add'); 24} 25 26console.table(old_ === array_[3]); // true

投稿2020/02/13 04:45

編集2020/02/13 07:42
Lhankor_Mhy

総合スコア36960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toromou

2020/02/13 07:38

確かにそうですね…完全に見落としていました。 Lhankor_Mhyさんやkei344さんから挙げていただいた方法は非破壊的なのでそちらの方が安全かもしれませんね。 ご親切にありがとうございました。参考にさせていただきます。
guest

0

ベストアンサー

こんにちは。スプレッド構文を使ってみるのはいかがでしょうか?

javascript

1 2 array[i] = [...(array[i] || []), 'add']; 3

投稿2020/02/13 04:38

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toromou

2020/02/13 05:23

なるほど。"||"を使えば簡潔に書けそうだとは思っていましたが、スプレッド構文と組み合わせて使うというのは目から鱗でした。 ただ、他の方のご回答にもあるように可読性を考えると元のままでもいい気もしてきました。 一番早くお答えいただいたのでこちらをベストアンサーとさせて頂きます。 ご回答いただいた皆様ありがとうございました。
jun68ykt

2020/02/13 06:07

どういたしまして。参考になれば幸いです。
guest

0

undefinedに対して追加することが確定しているなら。

js

1// ( array[i] || [] ).push( 'add' ); 2// 代入していなかった・・・。 3 ( array[i] || ( array[i] = [] ) ).push('add');

投稿2020/02/13 04:43

編集2020/02/13 04:51
kei344

総合スコア69606

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2020/02/13 04:50

(あ、まちがえた)
guest

0

JavaScript

1 array[i] = [...array[i] || [], 'add'];

投稿2020/02/13 04:54

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問