1. 空配列のときは目標に届かないので -1
  2. 要素が 1 つで初日に届くなら 1
  3. 3 日目で累計 120 になり目標 100 に届く
  4. 全部足しても 30 で目標 100 に届かないので -1
  5. 累計がちょうど目標と同じでも届いたとみなす
コース一覧
JavaScript基礎文法:処理を組み立てる
while で条件を満たす間くり返す

JavaScript基礎文法:処理を組み立てる

if・switch による条件分岐、配列とループ、関数とコールバック、オブジェクトを順に組み立てる全 33 レッスン(525 分)の基礎文法コースです。FizzBuzz、作品リスト、関数への整理、作品データの構造化を通して、入力から結果を返す処理を自分で分解して書きます。DOM 操作は次のコースで扱います。

1
条件分岐
01. if 文の基本15分
02. if / else if / else で段階判定15分
03. switch 文で値を一覧から選ぶ15分
04. 条件を組み合わせる20分
05. FizzBuzz で複数条件を組み立てる20分
06. つくる 時間帯で挨拶を変える20分
07. 第1章まとめクイズ10分
2
配列とループ
01. 配列のきほん15分
02. 要素を足す・取り除く15分
03. for ループで合計を求める15分
04. for-of で配列を走査する15分
05. while で条件を満たす間くり返す15分
06. break と continue でループを制御する15分
07. つくる 作品リストを一覧にする20分
08. 第2章まとめクイズ10分
3
関数
01. 関数宣言15分
02. アロー関数15分
03. デフォルト引数15分
04. 早期 return でネストを浅くする15分
05. 変数のスコープ15分
06. コールバック関数15分
07. forEach で配列をまわす15分
08. つくる 処理を関数に整理する20分
09. 第3章まとめクイズ10分
4
オブジェクト
01. オブジェクトのきほん18分
02. オブジェクトで複数の値を返す16分
03. const と参照18分
04. ?. で安全に取り出す16分
05. 分割代入18分
06. スプレッド構文18分
07. find と includes で探す16分
08. つくる 作品データを構造化する25分
09. 第4章まとめクイズ10分

while で条件を満たす間くり返す

while の条件と更新
解説

このレッスンで分かること

  • while (条件) { } は、条件が真である間くり返します
  • 条件に使う値をループの中で変えないと、永久に止まりません

何周で終わるかが、始める前に分からない

for は「配列の要素数だけ」「10 回」のように、回数が先に決まっている処理のための道具でした。ですが、始めてみないと終わりが分からない処理もあります。累計が目標に届くまで、目当てのものが見つかるまで、条件を満たすまで。回数ではなく状態でくり返しを止めたいときに使うのが while です。

JavaScript

let remaining = 3; while (remaining > 0) { console.log("公開まであと " + remaining + " 日"); remaining--; } // 公開まであと 3 日 // 公開まであと 2 日 // 公開まであと 1 日

丸カッコの条件を見て、真なら中を実行し、また条件に戻る。偽になったら抜ける。それだけです。for はカッコの中に初期化と更新がまとまっていましたが、while は初期化をループの前に、更新をループの中に、自分で置くことになります。そのぶん書き忘れても文法エラーにならない、というのが while の難しさです。

条件がひとつだと、配列の外まで見に行く

配列を while でまわすときは、条件がひとつでは足りません。目当てのものが最後まで見つからなかった場合、インデックスが要素数を超えても回り続けます。範囲外の要素は undefined なので、そのまま計算に混ぜれば結果は静かに壊れます。

そこで && で条件を 2 つつなぎ、「まだ範囲内で、かつ、まだ見つかっていない間」とします。

JavaScript

const statuses = ["下書き", "下書き", "公開"]; let i = 0; while (i < statuses.length && statuses[i] !== "公開") { i++; } console.log(i); // 2

範囲の検査を左に書くのが大事です。&& は左が偽なら右を見ないので、範囲を超えた瞬間に右の statuses[i] は評価されません。

条件が 2 つあるということは、ループを抜けた理由も 2 つあるということです。見つかって抜けたのか、要素が尽きて抜けたのか。抜けた直後に if でどちらだったかを確かめる、というのが while の定番の作法です。

JavaScript

if (i === statuses.length) { console.log("公開済みの作品はまだありません"); }

更新を書き忘れると、二度と返ってこない

while でいちばん怖いのが無限ループです。条件に使っている値がループの中で変わらなければ、条件は永遠に真のままです。

JavaScript

let day = 0; while (day < 3) { console.log(day); // day++ が無いので止まらない }

文法としては完全に正しいので、エラーも警告も出ません。while を書いたら「条件に出てくる変数はどれか」「それはループの中で変わるか」の 2 つを必ず確かめてください。とくに day++ を if の中に書くと、更新されない周ができて止まらなくなります。更新は if の外、本体のいちばん最後に置くのが安全です。

よくある間違い

  • 条件の向きを逆にする — 書くのは「くり返したい条件」であって「終わりたい条件」ではありません。0 から増えていく変数に while (total > 100) と書くと、1 周も実行されずに終わります
  • 初期化をループの中に置く — 本体の先頭に let day = 0; と書くと毎周ゼロに戻り、条件がいつまでも偽になりません。初期化は while の前です

要件

  1. 関数名は daysToGoal、引数は数値の配列 dailyViews と数値 goal の 2 つ、戻り値は数値
  2. くり返しには while 文を使うこと
  3. 配列の範囲を超えないよう、条件を && で 2 つ組み合わせること
  4. 目標に届かなかった場合は -1 を返すこと

入出力例

daysToGoal([], 100) → -1 daysToGoal([120], 100) → 1 daysToGoal([30,40,50], 100) → 3 daysToGoal([10,20], 100) → -1 daysToGoal([50,50], 100) → 2

ヒント

累計を入れる変数と日数を数える変数を、ループの前に `0` で用意します

条件は `while (day < dailyViews.length && total < goal)` の形になります

ループを抜けたあとに `if (total < goal)` で確かめ、届いていなければ `-1` を返します

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • break と continue でループを制御する

    ループを途中で抜ける `break` と、今の周だけ飛ばす `continue` を学びます。条件に合わないデータを除きながら回せるようになります。

  • つくる 作品リストを一覧にする

    第5章で学んだ配列とループを全部使って、作品名の配列から番号付きの一覧文字列を作る関数を書きます。

  • 第2章まとめクイズ

    第5章で学んだ配列の作りかたと取り出しかた、push と pop、for と for-of、while、break と continue を 5 問で確認します。

  • 関数宣言

    function キーワードで処理に名前を付け、引数を受け取って戻り値を返す仕組みを学びます。プロフィールサイトの挨拶づくりを関数にまとめます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 配列サイズ固定の同型データの集まり
  • 素数1 と自分自身でしか割り切れない自然数
  • 処理計算や代入を表す長方形
  • インデックスDB 検索を速くする索引
  • 評価出力品質を数値化して継続改善する活動
  • 変数データに名前をつけて参照する仕組み
  • 関数処理に名前を付けて再利用できる単位
main.js
学習モード
エディタを読み込んでいます

メモ

while で条件を満たす間くり返す

⌘S で保存