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

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

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

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

Q&A

解決済

2回答

915閲覧

javascriptの配列処理

uer03108

総合スコア194

JavaScript

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

0グッド

1クリップ

投稿2018/12/17 09:13

javascript中級的な質問です。
下記をアロー式(?)等で簡略化したいのですが、書き方をご教授願いますm(_ _)m

javascript

1 2 //オブジェクト配列 3 let ary = [{id : id_1, data_1 : aaaa, data_2 : AAAA, bl : false}, 4 {id : id_2, data_1 : bbbb, data_2 : BBBB, bl : false}, 5 {id : id_3, data_1 : cccc, data_2 : CCCC, bl : true}, 6 {id : id_4, data_1 : dddd, data_2 : DDDD, bl : false}]; 7 8 //配列ループ 9 for(let i in ary){ 10 if(ary[i]["bl"]){ 11 ary[i]["data_1"] = ""; 12 ary[i]["data_2"] = ""; 13 } 14 } 15 16 //配列ループ 17 for(let i in ary){ 18 ary[i]["bl"] = false; //初期化 19 }

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

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

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

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

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

guest

回答2

0

まず質問文のコードはblというキーが初期化の必要性のあり/なしであり、
後からfalseのキーに向かってfalseを代入しているので無駄だとおもいます。
なので、trueの場合だけfalseを上書き代入するように組んでいます。

(そもそもblキーが存在しないケースとかも想定内なんでしょうか?)


分割代入は後勝ちなのでこれでOK

JavaScript

1const start = {data_1: '', data_2: '', bl: false}; 2const array = [ 3 {id : "id_1", data_1 : "aaaa", data_2 : "AAAA", bl : false}, 4 {id : "id_2", data_1 : "bbbb", data_2 : "BBBB", bl : false}, 5 {id : "id_3", data_1 : "cccc", data_2 : "CCCC", bl : true}, 6 {id : "id_4", data_1 : "dddd", data_2 : "DDDD", bl : false} 7].map(it => it.bl ? {...it, ...start} : it); 8 9console.log(array); 10// 0: {id: "id_1", data_1: "aaaa", data_2: "AAAA", bl: false} 11// 1: {id: "id_2", data_1: "bbbb", data_2: "BBBB", bl: false} 12// 2: {id: "id_3", data_1: "", data_2: "", bl: false} 13// 3: {id: "id_4", data_1: "dddd", data_2: "DDDD", bl: false}

宣言と同時にmapで変更してしまえば副作用もへったくれもないのでオススメです。
一度なにかの変数を通過する想定であれば、{...it}を使ってシャローコピーで副作用を緩和すると良いでしょう。


一応、値の更新が目的です

配列は色々とメソッドを所持していますが、mapは配列の複製、forEachは処理の実行を明示するものなので、
今回のケースではforEachを使うべきでしょう。

JavaScript

1let ary = [ 2 {id : "id_1", data_1 : "aaaa", data_2 : "AAAA", bl : false}, 3 {id : "id_2", data_1 : "bbbb", data_2 : "BBBB", bl : false}, 4 {id : "id_3", data_1 : "cccc", data_2 : "CCCC", bl : true}, 5 {id : "id_4", data_1 : "dddd", data_2 : "DDDD", bl : false} 6]; 7ary.forEach(it => { 8 if (!it.bl) return; // ガード節で逃げればcontinueの代わりになる 9 it.data_1 = ''; 10 it.data_2 = ''; 11 it.bl = false; 12}); 13 14console.log(ary); 15// 0: {id: "id_1", data_1: "aaaa", data_2: "AAAA", bl: false} 16// 1: {id: "id_2", data_1: "bbbb", data_2: "BBBB", bl: false} 17// 2: {id: "id_3", data_1: "", data_2: "", bl: false} 18// 3: {id: "id_4", data_1: "dddd", data_2: "DDDD", bl: false}

ループ文を使いたければ、for...ofを使いましょう。
これが最速かつ自然な書き方だと思うので、変にこねくり回しても良くはならないと思います。

JavaScript

1let ary = [ 2 {id : "id_1", data_1 : "aaaa", data_2 : "AAAA", bl : false}, 3 {id : "id_2", data_1 : "bbbb", data_2 : "BBBB", bl : false}, 4 {id : "id_3", data_1 : "cccc", data_2 : "CCCC", bl : true}, 5 {id : "id_4", data_1 : "dddd", data_2 : "DDDD", bl : false} 6]; 7for (let it of ary) { 8 if (!it.bl) continue; // 同じくガード節でcontinue 9 it.data_1 = ''; 10 it.data_2 = ''; 11 it.bl = false; 12} 13 14console.log(ary); 15// 0: {id: "id_1", data_1: "aaaa", data_2: "AAAA", bl: false} 16// 1: {id: "id_2", data_1: "bbbb", data_2: "BBBB", bl: false} 17// 2: {id: "id_3", data_1: "", data_2: "", bl: false} 18// 3: {id: "id_4", data_1: "dddd", data_2: "DDDD", bl: false}

投稿2018/12/17 10:17

編集2018/12/17 10:40
miyabi-sun

総合スコア21158

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

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

uer03108

2018/12/17 10:44

有難うございました。 こちらを採用させて頂きます!
uer03108

2018/12/17 10:44

仰る通り、こちらが自然に見えますね。
guest

0

ベストアンサー

JavaScript

1 let ary = [{id : 'id_1', data_1 : 'aaaa', data_2 : 'AAAA', bl : false}, 2 {id : 'id_2', data_1 : 'bbbb', data_2 : 'BBBB', bl : false}, 3 {id : 'id_3', data_1 : 'cccc', data_2 : 'CCCC', bl : true}, 4 {id : 'id_4', data_1 : 'dddd', data_2 : 'DDDD', bl : false}]; 5 ary.map( v=> { 6 if ( v.bl ) { 7 v.data_1 = ''; 8 v.data_2 = ''; 9 } 10 v.bl = false; 11 return v; 12 } ); 13 console.log( ary ); 14```**動くサンプル:**[https://jsfiddle.net/yar0vw42/](https://jsfiddle.net/yar0vw42/)

投稿2018/12/17 09:30

kei344

総合スコア69366

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

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

uer03108

2018/12/17 10:00

有難うございました。 mapを使うんですね(forEachだと値が更新されない)。 //配列ループ for(let i in ary){ ary[i]["bl"] = false; //初期化 } の部分は、1行で書くなら、 ary.map( v=> {v.bl = false;return v;}); になりそうですね。
miyabi-sun

2018/12/17 10:19 編集

オブジェクトの配列なのでforEachで普通に値が更新されるはずです。 このコードの場合、副作用を起こす想定でforEach使った方が明示になると思いますしmapより良いと思います。 そしたら`return v;`の行削れますし。
miyabi-sun

2018/12/17 10:24

aryを破壊的変更したいのであれば、forEachを使う方が良いですね。 mapにはシャローコピーの複製という意味合いがあるので挙動は同じですが使わない方が良いでしょう。 コードをここに書くと汚れるので、私の回答に書きますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問