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

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

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

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

966閲覧

JavaScript Array.prototype.sort()内の比較関数の挙動について

GenkiSugiyama

総合スコア86

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/02/11 10:29

表題の件について、比較関数の挙動についていまいち理解ができていません。

MDNのsortメソッドについてのページとQiitaのこちらの記事を読んで、「sortメソッドで数値を比較しソートした場合は比較関数でソート順を定義する」ということは把握したつもりです。

そこで手元の環境(Node.js v14.4.0)で実際にコードを動かしてみたのですが、このときの比較関数に渡される引数の順番とが自分の中で腑に落ちませんでした。

JavaScript

1const arr = [1, 2, 3, 4, 5]; 2 3// 比較関数の定義 4const judge = (n, m) => { 5 console.log(`${n} > ${m}`, n > m); 6 return n > m ? -1 : 1; 7} 8 9console.log(arr.sort(judge)); // [5, 4, 3, 2, 1]

ソートの実行時、配列の先頭から「1,2」、「2,3」、「3,4」、「4,5」がそれぞれ「n,m」に渡されて比較が行われていると思っていましたが、予想とは逆で、mにインデックスが小さい数字 / nにインデックスが大きい数値 が格納されていました。

2 > 1 true 3 > 2 true 4 > 3 true 5 > 4 true [ 5, 4, 3, 2, 1 ]

インデックスが小さい順に第一引数、第二引数に値が渡されていると思っていたのですが、なぜ上記のような渡し方になっているのでしょうか?

初歩的な質問かもしれないですが、ご回答いただけると大変ありがたいです。

よろしくお願いいたします。

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

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

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

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

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

GenkiSugiyama

2021/02/11 12:07 編集

いえ、私のコードはJavaScript、Reactに関する書籍で紹介されていたものです。 その書籍内の解説が自分にとっては不十分でいまいち理解できていないのでこちらで疑問を解消できればと思い投稿しました。
Zuishin

2021/02/11 12:13

話が質問に書いてあることから変わったようですが。 まあこんなのは実装依存としか言いようがなく、ブラウザが変われば変わる程度のものです。
guest

回答2

0

ベストアンサー

インデックスが小さい順に第一引数、第二引数に値が渡されていると思っていたのですが、なぜ上記のような渡し方になっているのでしょうか?

渡し方は処理系依存(ブラウザやバージョンが変われば変化しうる)です。そのような動作に依存するコードを書くほうが適当ではないので、考えても仕方ないです。

投稿2021/02/11 12:28

maisumakun

総合スコア145192

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

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

GenkiSugiyama

2021/02/11 12:46

ご回答ありがとうございます。 処理系依存、初めて聞くワードでした・・・ もしよろしければ、なぜ処理系依存であると判断されたのかご教示いただけますでしょうか? なにか、「〇〇場合の不思議な挙動は処理系依存である」というような基準があるのでしょうか?
guest

0

ソートの実行時、配列の先頭から「1,2」、「2,3」、「3,4」、「4,5」がそれぞれ「n,m」に渡されて比較が行われていると思っていましたが、

あなたがそう思った根拠は何でしょうか。
どこかにそうなると書いてあったんでしょうか

投稿2021/02/11 11:16

y_waiwai

総合スコア87784

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

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

GenkiSugiyama

2021/02/11 12:27

特に根拠はなく、ほぼ思い込みに近いものです。 強いて言えば、質問内容にも記載していますが、この質問を投稿する前に参考にしたQiitaの記事(https://qiita.com/ymk83/items/3d53e0965a278b5cfd4d#%E6%95%B0%E5%80%A4%E3%81%AE%E6%98%87%E9%A0%86%E9%99%8D%E9%A0%86%E3%81%A7%E3%82%BD%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)内に以下のようなサンプルコードがあり、それを根拠にしました。 【昇順ソートの例】 ``` var array = [1975,11,20]; array.sort( function(a,b) { // 戻り値が正(a-bの差が正)のとき、aをbの後ろに並べ替え // 戻り値が負(a-bの差が負)のとき、aをbの前に並べ替え return a - b; } ); // [11, 20, 1975] console.log(array); ``` 「戻り値が正(a-bの差が正)のとき、aをbの後ろに並べ替え」 これを与えられている配列の値で置き換えたときに、 最初の処理で配列の「1975」「75」がそれぞれ「a」「b」に格納され「a - b」の結果は正となり「1975」が「75」の後ろに並び替えられる。 このように考えました。 そのため、元のコードでも配列の先頭から順に第一引数に渡されるのだろうと予想しました。 ただ、上記コードの引数をconsoleで確認してもこの予想と逆だったのでどうしたものか・・・という状況です。
y_waiwai

2021/02/11 12:34

正式なドキュメントに記載されたものでないなら、まーそんなこともあるかもねー程度の話ですね
GenkiSugiyama

2021/02/11 12:48

ありがとうございます。 ときには原因を探し続けるのではなく、「そういうものなのか」と受け入れないといけない場合もあるのですね・・・(そもそも公式に記載がない勝手な思い込みを捨てろという話もありそうですが・・)
y_waiwai

2021/02/11 13:01

そもそも公式のものでないなら信用してはダメなものでしょう。 どこのだれとも知れない顔も知らないアカの他人が書いたものを真に受けてはいけません。 自分で検証して、それが本当かを確かめていきましょう
GenkiSugiyama

2021/02/11 13:10

おっしゃる通りです! ご回答・アドバイスありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問