アレイ高次関数Array.sort


配列高次関数は


配列高次関数とは、関数を引数として渡したり戻したりする関数です.
JavaScriptの関数は1レベルのオブジェクトなので、値のように関数を引数として渡したり、返したりすることができます.
これは不変状態向けの関数式プログラミングに基づいている.
反復文と条件文の欠点は,構成論理を把握することが難しく,エラーが発生しやすく,コードの可読性も悪いことである.関数プログラミングは,それを最小化し,プログラムの安定性を向上させる努力の一つである.

Array.prototype.sort


sortメソッドは、ソース配列の要素をソートします.ソース配列を直接変更して、整列された要素を返すこともできます.


1.文字列のソート

const friut = ['Banana', 'Orange', 'Apple']

// 오름차순 정렬
console.log(friut.sort()); // ['Apple', 'Banana', 'Orange'] -> 원본 배열을 직접 변경한다.

// 내림차순 정렬
console.log(friut.sort().reverse()) //['Orange', 'Banana', 'Apple']

// reverse 메소드도 원본 배열을 직접 변경한다.
console.log(friut)

2.数値ソート

const number = [40, 100, 1, 5, 2, 25, 10];

console.log(number.sort()); // (7) [1, 10, 100, 2, 25, 40, 5] ???????
// 의도한대로 정렬되지 않는 모습

// 숫자 정렬은 유니코드 코드 포인트 순서를 따른다. 쉽게 말하자면 1은 2보다 무조건 앞인셈,,

console.log(['2', '1'].sort()); // ['1', '2']
console.log([2, 1].sort()); // [1, 2]
sortメソッドは、配列内の要素を一時的に文字列に変換し、ソートします.
数字の並べ替えから見ると,[1,2,5,10,25,410]の順であるはずだが,並べ替えがおかしい.
では、数字はどのようにソートすればいいのでしょうか.

3.JavaScriptの例外ソート


前に見たように、数値要素は目的の結果を得るのが難しい.sortメソッドのデフォルトのソート順はUnicodeコードポイントに従います.配列内の要素が数値タイプであっても、配列内の要素を文字列に変換し、Unicodeコードポイントの順序に従ってソートします.
たとえば、文字列「10」のUnicode点は、文字列「2」のコード点よりも先であるため、この値が返されます.
したがって,数値要素をソートする際には,比較ソート順の比較因子(関数)をsort法に渡す必要がある.
const number = [40, 100, 1, 5, 2, 25, 10];

// 숫자 배열의 오름차순 정렬, 비교함수의 반환값이 0 보다 작으면 a를 우선으로 정렬한다.
console.log(number.sort((a, b) => a - b)) // (7) [1, 2, 5, 10, 25, 40, 100]

// 숫자 배열의 내림차순 정렬, 비교함수의 반환값이 0보다 작으면 b를 우선으로 정렬한다.
console.log(number.sort((a, b) => b - a)) // (7) [100, 40, 25, 10, 5, 2, 1]
a-b値が負数なのか負数なのか、ソートが違います!
特にarr.sort(((a,b)=>a−b)構文は非常に多く用いられる.暗記したほうがいいです.