| layout | default |
|---|---|
| title | Sort |
| parent | Arrays |
| grand_parent | JavaScript |
| nav_order | 3 |
{: .no_toc .text-beta .fw-700}
{: .no_toc .text-delta }
- TOC {:toc}
method sorts an array alphabetically
sort()함수는 두 개의 값을 비교하여, 상기 비교 함수 값을 전송하고, 반환(-, 0, +)의 값에 따른 값을 정렬
▸ 결과가 음수 이면 b 이전에 a 정렬
▸ 결과가 양수 이면 a 이전에 b 정렬
▸ 결과가 0이면 두 값의 정렬 순서가 변경되지 않음
▸ a-z순
▸ 숫자가 문자보다 먼저 정렬, 문자열인 숫자도 숫자로 이해해서 먼저정렬
▸ 전체 숫자값보다 첫 번째 숫자의 오름차순으로 정렬한다 ex) 23 6 abcd 이렇게
Syntax {: .label .mt-2}
reverses the elements in an array
▸ sort후 reverse하면 내림차순
Syntax {: .label .mt-2}
<span class="fs-2">
[W3School](https://www.w3schools.com/js/tryit.asp?filename=tryjs_array_sort_reverse){: .btn .btn-outline .mt-2}
</span>
---
## Sorting Array Elements Technics (Numeric Sort)
기본으로 the sort() 함수는 값을 문자열로 정렬
→ 숫자는 첫 번째 숫자의 오름차순으로 정렬해 25보다 100이 먼저 정렬됨
▸ 해결법 : 함수이용(compare funtion)
### The Compare Function
비교 함수의 목적은 대체 **정렬 순서를 정의하는 것**
▸ 비교 함수는 인수에 따라 음수, 0 또는 양수 값을 반환
syntax
{: .label .mt-2}
<div class="code-example" markdown="1">
function(a, b){return a - b}
</div>
```js
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
//Sort Alphabetically
function myFunction1() {
points.sort();
document.getElementById("demo").innerHTML = points;
}
//Sort Numerically
function myFunction2() {
points.sort(function(a, b){return a - b});
document.getElementById("demo").innerHTML = points;
}
예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
function myFunction() {
points.sort(function(a, b){return a - b});
document.getElementById("demo").innerHTML = points;
}예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
function myFunction() {
points.sort(function(a, b){return b - a});
document.getElementById("demo").innerHTML = points;
}▸ 무작위지만 우선순위가 있음
▸ Fisher Yates Shuffle 방법을 더 선호해서 사용 (뒤에 설명되어 있음)
예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
function myFunction() {
points.sort(function(a, b){return 0.5 - Math.random()});
document.getElementById("demo").innerHTML = points;
}위의 무작위 배열에서 사용하는 array.sort() 방법이 정확하지 않아서(우선순위가 있음) Fisher Yates Shuffle 이라는 방법을 자주 씀
예제 {: .label .label-purple .mt-2}
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
function myFunction() {
var i, j, k;
for (i = points.length -1; i > 0; i--) {
j = Math.floor(Math.random() * i)
k = points[i]
points[i] = points[j]
points[j] = k
}
document.getElementById("demo").innerHTML = points;
}
</script>배열에서는 최대 값이나 최소 값을 찾기 위한 내장함수가 없어서 값을 찾기 위한 세가지 방법이 있음
오름 or 내림차순으로 정렬한 첫 번째나 마지막번째가 highest or lowest value
-
예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return a-b}); document.getElementById("demo").innerHTML = points[0]; //result is 1
-
예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10]; points.sort(function(a, b){return b-a}); document.getElementById("demo").innerHTML = points[0]; //result is 100
직접 함수(메소드)를 만들어서 사용 (가장 빠른방법)
-
예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = myArrayMin(points); function myArrayMin(arr) { var len = arr.length; var min = Infinity; while (len--) { if (arr[len] < min) { min = arr[len]; } } return min; }
-
예제 {: .label .label-purple .mt-2}
var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = myArrayMax(points); function myArrayMax(arr) { var len = arr.length; var max = -Infinity; while (len--) { if (arr[len] > max) { max = arr[len]; } } return max; }
최대나 최소값 하나만 원하면 위 두가지 방법은 정말 비효율적임
★ max() or min() 사용하는게 효율적
-
Math.max.apply() : 배열에서 가장 높은 숫자를 찾는 데 사용```js var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = myArrayMax(points);
function myArrayMax(arr) { return Math.max.apply(null, arr); or Math.max(1, 2, 3) //이경우 매개변수에 배열이 들어가면 안됨, toString이나 join 써도 안됨ㅠ }
-
Math.min.apply() : 배열에서 가장 낮은 숫자를 찾는 데 사용```js var points = [40, 100, 1, 5, 25, 10]; document.getElementById("demo").innerHTML = myArrayMin(points);
function myArrayMin(arr) { return Math.min.apply(null, arr); or Math.min(1, 2, 3) //이경우에도 매개변수에 배열이 들어가면 안됨, toString이나 join 써도 안됨
}
배열에 포함된 객체를 정렬할 때 사용
숫자 정렬
예제 {: .label .label-purple .mt-2}
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
displayCars();
function myFunction() {
cars.sort(function(a, b){return a.year - b.year});
displayCars();
}
function displayCars() {
document.getElementById("demo").innerHTML =
cars[0].type + " " + cars[0].year + "<br>" +
cars[1].type + " " + cars[1].year + "<br>" +
cars[2].type + " " + cars[2].year;
}문자열 정렬
예제 {: .label .label-purple .mt-2}
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
displayCars();
function myFunction() {
cars.sort(function(a, b){
var x = a.type.toLowerCase();
var y = b.type.toLowerCase();
if (x < y) {return -1;} //마이너스면 앞으로 정렬
if (x > y) {return 1;} //플러스면 뒤로 정렬 – 그래서 알파벳이 클수록 앞으로감
return 0;
});
displayCars();
}
function displayCars() {
document.getElementById("demo").innerHTML =
cars[0].type + " " + cars[0].year + "<br>" +
cars[1].type + " " + cars[1].year + "<br>" +
cars[2].type + " " + cars[2].year;
}