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

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

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

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

Q&A

解決済

3回答

6143閲覧

js 多次元配列 一番大きい数を取り出すには?

may88seiji

総合スコア79

JavaScript

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

0グッド

1クリップ

投稿2016/12/10 15:08

###実現したいこと
多次元配列の各配列の一番大きい数字を取り出したいです。


([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) → [27,5,39,1001]
([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]) → [9, 35, 97, 1000000]

###試したこと
下記コードを試したところ、27,5,1001が返ってきます。
なぜか39が返ってきません。
私のコードの不備の指摘、または他の記述をお教えいただければ幸いです。

###該当のソースコード

javascript

1function largestOfFour(arr) { 2 var newArray = []; 3 var subArray = 0; 4 for(var i = 0; i < arr.length; i++){ 5 for(var j = 0 ; j < arr.length; j++){ 6 if(subArray < arr[i][j]){ 7 subArray = arr[i][j]; 8 }else if( j === arr.length-1){ 9 newArray.push(subArray); 10 subArray = 0; 11 } 12 } 13 } 14 return newArray.join(','); 15} 16 17largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

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

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

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

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

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

guest

回答3

0

最小限の変更で行くと、

JavaScript

1function largestOfFour(arr) { 2 var newArray = []; 3 var subArray = 0; 4 for(var i = 0; i < arr.length; i++){ 5 for(var j = 0 ; j < arr[i].length; j++){ //この行は間違っていたが、正方形の行列だと元のままでもOK 6 if(subArray < arr[i][j]){ 7 subArray = arr[i][j]; 8 } 9 if( j === arr.length-1){ //これが原因 10 newArray.push(subArray); 11 subArray = 0; 12 } 13 } 14 } 15 return newArray.join(','); 16} 17 18largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

もうちょっと直すと、

JavaScript

1function largestOfFour(arr) { 2 var newArray = []; 3 var max; 4 for(var i = 0; i < arr.length; i++){ 5 max = -Infinity; 6 for(var j = 0 ; j < arr[i].length; j++){ 7 max = Math.max(max,arr[i][j]); 8 } 9 newArray.push(max); 10 } 11 return newArray.join(','); 12} 13 14largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

(内側の)ループの中で何をすべきか(そもそも何のためのループなのか)、ループが始まる前に何をすべきか、ループの後で何をすべきか、をよく考えましょう。

さらに直すと、

JavaScript

1function largestOfFour(arr) { 2 return arr.map(function(subArr){ 3 return subArr.reduce(function(x,y){ 4 return Math.max(x,y); 5 }) 6 }).join(','); 7} 8largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

投稿2016/12/10 16:05

編集2016/12/10 16:18
otn

総合スコア84533

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

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

may88seiji

2016/12/10 16:17

回答ありがとうございます。 max = -Infinity;で初期化されているのですね。 Math.max(max,arr[i][j]);で比較しているのも勉強になりました。Math.minで応用できますね。
guest

0

ベストアンサー

JavaScript

1if(subArray < arr[i][j]){ 2 subArray = arr[i][j]; 3} else if( j === arr.length-1){ //←このelseが不要です 4 newArray.push(subArray); 5 subArray = 0; 6}

最後の要素がその配列の中で最大だったとき、前のifの処理がtrueのほうに流れるので、newArray.pushのほうが実行されなくなるからです。前のifがどちらに流れようと、こちらのifは実行しなければならないので。

投稿2016/12/10 15:28

sii_side

総合スコア849

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

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

may88seiji

2016/12/10 15:44

無事に動作しました!ありがとうございます。
guest

0

これでいいです。

javascript

1function largestOfFour(arr){ 2 return arr.map(function(v, i){ 3 return Math.max.apply(null, v); 4 }) 5}; 6 7largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // [27, 5, 39, 1001] 8largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]); // [9, 35, 97, 1000000]

ある配列の最大値、最小値を求める処理は下記で、それを二次元配列内の書く配列に適用する形です。
スプレッド演算子(...)を使うとより単純な形で書けますが、新しい仕様なので注意してください。

javascript

1// 最大値 2Math.max.apply(null, array); 3Math.max(...array); // スプレッド演算子を使用する場合 4 5// 最小値 6Math.min.apply(null, array); 7Math.min(...array); // スプレッド演算子を使用する場合

投稿2016/12/11 10:37

yamato_hikawa

総合スコア2092

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

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

may88seiji

2016/12/11 12:39

yamato_hikawaさん スプレッド演算子を知らなかったので勉強になりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問