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

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

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

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

Q&A

解決済

3回答

1521閲覧

配列の中から一番長い名前を取得する

mayupaca

総合スコア3

JavaScript

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

0グッド

1クリップ

投稿2021/11/12 13:18

編集2021/11/12 13:50

プログラミング初学者です。
console.logに入力された配列の中の一番長いインストラクターの名前を取得する問題です。
答えは以下のコードだったのですが、なぜ let longestNameIndex = 0;が必要なのかわかりません。でもこれがないと答えが違ってきます。どなたか教えていただけますでしょうか。
よろしくお願いします。

const instructorWithLongestName = function (instructors) { let longestName = 0; let longestNameIndex = 0; for (let i = 0; i < instructors.length; i++) { if (longestName < instructors[i].name.length) { longestName = instructors[i].name.length; longestNameIndex = i; } } return instructors[longestNameIndex]; }; console.log(instructorWithLongestName([ { name: "Samuel", course: "iOS" }, { name: "Jeremiah", course: "Web" }, { name: "Ophilia", course: "Web" }, { name: "Donald", course: "Web" } ])); console.log(instructorWithLongestName([ { name: "Matthew", course: "Web" }, { name: "David", course: "iOS" }, { name: "Domascus", course: "Web" } ]));

let longestNameIndex = 0; がある場合コンソールには、
{ name: "Jeremiah", course: "Web" }
{ name: "Domascus", course: "Web" }
が返ってきます。

でも、let longestNameIndex = 0;がない下記のコードの場合コンソールには、
{ name: "Donald", course: "Web" }
{ name: "Domascus", course: "Web" }
が返ってきます。
どうして下記のコードでは、
{ name: "Jeremiah", course: "Web" }
{ name: "Domascus", course: "Web" }
が返ってこないのでしょうか?

const instructorWithLongestName = function (instructors) { let longestName = ""; for (let i = 0; i < instructors.length; i++) { if (longestName.length < instructors[i].name.length) { longestName = instructors[i]; } } return longestName; };

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

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

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

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

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

otn

2021/11/12 13:31

> もこれがないと答えが違ってきます。 どういうコードですか?
guest

回答3

0

「let longestNameIndex = 0;」を削除しただけじゃ無くて、全然違うプログラムじゃないですか。
全然違うプログラムだと言うことがわからなかったのでしょうか?

結果が違うのは、2つめのプログラムにバグがあるからです。
longestName.name.lengthを見るべきなのに、longestName.lengthを見ています。

JavaScript

1const instructorWithLongestName = function (instructors) { 2 let longestName = {name:""}; 3 4 for (let i = 0; i < instructors.length; i++) { 5 if (longestName.name.length < instructors[i].name.length) { 6 longestName = instructors[i]; 7 } 8 } 9 10return longestName; 11};

あるいは、名前だけ返すのなら、

JavaScript

1const instructorWithLongestName = function (instructors) { 2 let longestName = ""; 3 4 for (let i = 0; i < instructors.length; i++) { 5 if (longestName.length < instructors[i].name.length) { 6 longestName = instructors[i].name; 7 } 8 } 9 10return longestName; 11};

投稿2021/11/12 14:32

otn

総合スコア85901

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

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

mayupaca

2021/11/12 15:22

説明がうまくできず、すみませんでした。教えていただきありがとうございます。
guest

0

ベストアンサー

とりあえず、プログラミングというのは『こう書けばいい』というものではありません。
現実世界のシミュレーション』です。

まずはコードを読みましょう。デバッガを使ってもいいですが。
コードを読むコツは『一行レベルで、その行が何をしているのかを考えながら読む』です。

JavaScript

1// 単純に配列を作ってそれをinstructorWithLongestName関数に渡して、その結果を出力する 2console.log(instructorWithLongestName([ 3 { name: "Samuel", course: "iOS" }, 4 { name: "Jeremiah", course: "Web" }, 5 { name: "Ophilia", course: "Web" }, 6 { name: "Donald", course: "Web" } 7]));

次に、その呼ばれた関数、instructorWithLongestName関数の内部も同じようにやる。

JavaScript

1// 定義する 2const instructorWithLongestName = function (instructors) { 3 // 変数 longestName を用意し、0で初期化する 4 let longestName = 0; 5 // 変数 longestNameIndex を用意し、0で初期化する 6 let longestNameIndex = 0; 7 8 // 変数iの初期値: 0, iがinstructorsの長さ未満の間, ループしながら+1する 9 // ---> ( instructorsの長さ分、ループする) 10 for (let i = 0; i < instructors.length; i++) { 11 // 現在のlongestNameよりもinstructorsのi番目にあるデータのnameの長さが大きいなら 12 if (longestName < instructors[i].name.length) { 13 // longestName を 長い方(instructors[i]の方)の名前の長さにする 14 longestName = instructors[i].name.length; 15 // longestNameIndex を 現在の場所( i番目 ) に更新する 16 longestNameIndex = i; 17 } 18 19 } 20 // 一番長い方の場所のデータを返す 21 return instructors[longestNameIndex]; 22};

これを疑似コードとして書きだしてみましょう。

[疑似コード] 1. 引数instructorsを引き受けて処理するinstructorWithLongestNameを定義 1.1. 変数 longestNameを用意し、0で初期化する 1.2. 変数 longestNameIndex を用意し、0で初期化する 1.3. instructorsの長さ分、以下をループする 1.3.1. longestNameよりもinstructorsのi番目のnameの長さが大きいなら 1.3.1.1. longestNameをinstructors[i]のnameの長さに更新する 1.3.1.2. longestNameIndexを現在の場所(i番目)に更新する 1.4. 一番長い方の場所のデータを返す

更に、現実世界でシミュレーションしてみましょう。つまり、上記の疑似コードを料理のレシピなりととらえて手作業でやってみましょう。

仮に (1.2)を削除すると、longestNameIndexの初期値はわからないため、場合によっては結果が変わってきそうですね。JavaScriptではPaiza IOで試すとReferenceError: n is not definedとなります。これは『宣言していない事が原因』です。
var n; Console.log(n);のように変数宣言を前に置けば、0で初期化はされるようですが。

で、(1.2)と(1.3.1.2)を同時に削除したとしても、結果は違ってきます。(ちなみに(1.4)も書き換えているとする)

実際に試してみればわかりますよ。

(1.1)で longestName = 0 という定義。(1.2)は削除済みなのでスルー。
(1.3)で最初の"Samuel" のやつでやる。(1.3.1)で条件に一致するため、longestName = 6 ("Samuel"の長さ)となる。

longestName = 0 ↓ longestName = 6

で、(1.3.1.2)は無視。よって(1.3)に戻る。forの条件式を満たすので、(1.3.1)に。
……とやっていく。

でも、(1.4)では一番長い方の場所にあるデータを返すので、longestNameIndexのようなものが必要。

単純に現実世界で考えてみましょう。

{ name: "Samuel", course: "iOS" }, { name: "Jeremiah", course: "Web" }, { name: "Ophilia", course: "Web" }, { name: "Donald", course: "Web" }

に相当するデータがあって、nameに割り振られているデータの長さが一番長い方のデータを取りたいとする場合、どうしますか?

私なら、まず "Sumuel"の長さを調べる。6ですね。よって長さ6の"Sumuel"を暫定一位とする。
この暫定一位をノートかなんかに記録しておく。
ただ、その場所も欲しいので、『暫定一位の長さ』と『暫定一位の場所』の二つが欲しいですね。
なので 『長さ』と『場所』をそれぞれノートに記録する。

そして二番目にある "Jeremiah"を調べる。長さは8。
暫定一位の長さは6なので、現在のものが長いですね。よって暫定一位を6から8に書き換える。
それと暫定一位の場所も。

さらに三番目の"Ophilia"も同様に。
そうすると、最終的に『暫定一位の長さ』が『一番長い方の長さ』、『暫定一位の場所』が『一番長い方の場所』となりますね。

そして、その『暫定一位の場所』を見れば『一番長い方のデータ』となりますよね。

これを実装しているだけです。

投稿2021/11/12 14:05

BeatStar

総合スコア4962

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

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

mayupaca

2021/11/12 15:04

とても丁寧に説明していただきありがとうございました。すごくわかりやすかったです。コードをただ書くだけではなく、もっと読む訓練もしないといけないと気づけました。
guest

0

でもこれがないと答えが違ってきます。

JavaScriptで宣言していない変数を使った場合、非strictな環境では自動でグローバル変数となってしまいます。

グローバル変数なので、関数を2回実行したときには前の値が残ってしまいます。

投稿2021/11/12 13:32

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問