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

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

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

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

3回答

1286閲覧

js reactつき コードリーディング

violineer

総合スコア72

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2018/03/27 06:36

編集2018/03/27 07:42

js

1 const sections = this.props.chapter.sections; 2 for (let i = 0; i < sections.length; i++) { 3 for (let j = 0; j < sections[i].exercises.length; j++) { 4 const isCompleted = 5 completedExerciseIdList.indexOf( 6 this.props.courseId + "/" + sections[i].exercises[j].exerciseId 7 ) >= 0; 8this.setState({ isCompleted, isOpen });

このコードが何をしているか理解したいです。
具体的に知りたい部分として
、4行目の変数宣言の部分の解釈が「completeExerciseIdListのindexOfによる結果が0以上である場合に、iscompletedが定義される」という理解であっているか教えていただきたいです

補足
みなさんありがとうございます。
このコードの目的は、元々は
「全てのsectionが終了(こちらの言葉ですみません)」したら「isCompletedをtrueにする」というものであったようなのですが、現在は(みなさんの回答を元に考えると)
「for文による繰り返しを行い、"最後の"チャプターが終了されていればisCompletedをtrueにする」という仕様」という風になっているようですね……
別質問で上記目的の方法を伺いたいと思います。ありがとうございました。

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

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

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

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

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

guest

回答3

0

4行目の変数宣言の部分の解釈が「completeExerciseIdListのindexOfによる結果が0以上である場合に、iscompletedが定義される」という理解であっているか

違います。変数自体は条件にかかわらず定義されて、その中身がtrueになるかfalseになるか、という話です。

投稿2018/03/27 06:41

maisumakun

総合スコア145184

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

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

violineer

2018/03/27 06:44

そうしますと、このコードの繰り返しは 「iscompletedの値をfalseかtrueで更新している」 ことになりますか??
maisumakun

2018/03/27 06:52

そうですね、{}内に書かれた「isCompleted」だけのものは、「isCompleted: isCompleted」の省略形です。
guest

0

ベストアンサー

字下げと括弧の開け締めはちゃんとしましょうね!

JavaScript

1const sections = this.props.chapter.sections; 2for (let i = 0; i < sections.length; i++) { 3 for (let j = 0; j < sections[i].exercises.length; j++) { 4 const isCompleted = 5 completedExerciseIdList.indexOf( 6 this.props.courseId + "/" + sections[i].exercises[j].exerciseId 7 ) >= 0; 8 this.setState({ isCompleted, isOpen }); 9// 以下の波括弧2つが閉じ忘れ 10 } 11}

completedExerciseIdListの定義が良く分かりませんが、
変数名から察するに恐らく配列なので、Array.prototype.indexOf()を指しているのでしょう。
つまり、配列の要素からthis.props.courseId + "/" + sections[i].exercises[j].exerciseIdを探していき、見つからなかったら-1を返す事を想定しています。

なのでconst isCompleted = -1 >= 0;という関係演算子で評価され、
検索した結果、存在すればtrue、存在しなければfalseというBoolean値が代入されます。

その結果を元にthis.setState({ isCompleted, isOpen })を実行しています。

forは読みづらいのでfor...ofで書き直すとこんな感じになります。
あと、completedExerciseIdList.indexOf() !== -1は読み物としては重いので、isCompletedという関数名で外出ししました。

JavaScript

1// isCompleted :: Exercise -> Boolean 2const isCompleted = exercise => 3 completedExerciseIdList.indexOf( 4 this.props.courseId + "/" + exercise.exerciseId 5 ) !== -1 // -1か否かで確認した方がプログラマにとっては分かりやすい 6 7for (const section of this.props.chapter.sections) { 8 for (const exercises of section.exercises) { 9 this.setState({ 10 isCompleted: isCompleted(exercises), 11 isOpen 12 }); 13 } 14}

投稿2018/03/27 07:00

編集2018/03/27 07:04
miyabi-sun

総合スコア21158

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

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

0

var x;

変数xを宣言

var x; x = 1;

変数xを宣言した後、変数xに値を代入

var x = 1;

変数xを宣言すると同時に値も代入して初期化。

const isCompleted = completedExerciseIdList.indexOf( this.props.courseId + "/" + sections[i].exercises[j].exerciseId ) >= 0;

定数isCompletedを宣言すると同時に値を代入。
この場合、completedExerciseIdListにfor文内で動的に生成された対象の文字列があればtrueが代入され、そうでない場合はfalseが代入される。

追記

何やらコードリーディングが大変そうな気がしてくるコードですね。

それと、setStateをfor文の中で呼んでますけど、それだとループする度にビューを再レンダリングしてると思います。コードリーディングということでご自身のコードではないのでしょうが、本来ならsetStateは一回でまとめたいところですね。

投稿2018/03/27 06:58

編集2018/03/27 07:30
HayatoKamono

総合スコア2415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問