JavaScript : Sorting Array

Penyortiran adalah tugas umum ketika menggunakan array. Hal tersebut akan digunakan, misalnya, jika kalian ingin menampilkan nama kota atau wilayah dalam urutan abjad.

Objek JavaScript Array memiliki metode sort() bawaan untuk menyortir elemen array dalam urutan abjad. Berikut contoh penggunaannya:

var fruits = ["Banana", "Orange", "Apple", "Papaya", "Mango"];
var sorted = fruits.sort();

alert(fruits); // Outputs: Apple,Banana,Mango,Orange,Papaya
alert(sorted); // Outputs: Apple,Banana,Mango,Orange,Papaya
Reversing Array

Kalian bisa menggunakan metode reverse() untuk membalik urutan elemen-elemen dari array.

Metode ini membalikkan array sedemikian rupa sehingga elemen array pertama akan menjadi yang terakhir, dan elemen array terakhir akan menjadi yang pertama. Berikut contohnya:

var counts = ["one", "two", "three", "four", "five"];
var reversed = counts.reverse(); 

alert(counts); // Outputs: five,four,three,two,one
alert(reversed); // Output: five,four,three,two,one

Catatan: Metode sort() dan reverse() memodifikasi array asli dan mengembalikan referensi ke array yang sama, seperti yang kalian lihat pada contoh di atas.

Menyortir Numeric Array

Metode sort() dapat menghasilkan hasil yang tidak terduga ketika diterapkan pada array numerik (mis. Array yang berisi nilai numerik). Contohnya:

var numbers = [5, 20, 10, 75, 50, 100];
numbers.sort(); // Sorts numbers array
alert(numbers); // Outputs: 10,100,20,5,50,75

Seperti yang kalian lihat, hasilnya berbeda dari yang kita harapkan. Ini terjadi karena, metode sort() mengurutkan elemen array numerik dengan mengubahnya menjadi string (yaitu 20 menjadi “20”, 100 menjadi “100”, dan seterusnya), dan karena karakter pertama dari string “20” (yaitu “2”) muncul setelah karakter pertama dari string “100” (yaitu “1”), itu sebabnya nilai 20 diurutkan setelah 100.

Untuk memperbaiki masalah penyortiran ini dengan array numerik, kalian dapat melewati fungsi pembandingan, seperti ini:

var numbers = [5, 20, 10, 75, 50, 100];

// Sorting an array using compare function
numbers.sort(function(a, b) {
    return a - b;
});
alert(numbers); // Outputs: 5,10,20,50,75,100

Seperti yang kalian lihat, kali ini kita mendapatkan hasil yang benar. Mari kita lihat cara kerjanya.

Ketika fungsi pembandingan ditentukan, elemen array diurutkan sesuai dengan nilai balik fungsi bandingkan. Misalnya, ketika membandingkan a dan b:

  • Jika fungsi bandingkan mengembalikan nilai kurang dari 0, maka a datang lebih dulu.
  • Jika fungsi bandingkan mengembalikan nilai lebih besar dari 0, maka b datang lebih dulu.
  • Jika fungsi bandingkan mengembalikan 0, a dan b tetap tidak berubah sehubungan satu sama lain, tetapi diurutkan sehubungan dengan semua elemen lainnya.

Oleh karena itu, karena 5 – 20 = -15 yang kurang dari 0, maka 5 datang pertama, sama 20 – 10 = 10 yang lebih besar dari 0, oleh karena itu 10 datang sebelum 20, demikian pula 20 – 75 = -55 yang kurang dari 0, jadi 20 datang sebelum 75, juga 50 datang sebelum 75, dan seterusnya.

Menemukan Nilai Maksimum dan Minimum dalam Array

Kalian bisa menggunakan metode apply() dalam kombinasi dengan Math.max() dan Math.min() untuk menemukan nilai maksimum dan minimum di dalam array, seperti ini:

var numbers = [3, -7, 10, 8, 15, 2];

// Defining function to find maximum value
function findMax(array) {
    return Math.max.apply(null, array);
}

// Defining function to find minimum value
function findMin(array) {
    return Math.min.apply(null, array);
}

alert(findMax(numbers)); // Outputs: 15
alert(findMin(numbers)); // Outputs: -7

Metode apply() menyediakan cara yang mudah untuk mengirimkan nilai array sebagai argumen ke fungsi yang menerima beberapa argumen dalam cara yang mirip array, tetapi bukan metode array (mis. Math.max() dan Math.min() di sini). Jadi, pernyataan yang dihasilkan Math.max.apply(null, numbers) dalam contoh di atas setara dengan Math.max (3, -7, 10, 8, 15, 2).

Menyortir Array dari Objek

Metode sort() juga dapat digunakan untuk menyortir array objek menggunakan fungsi bandingkan.

Contoh berikut akan menunjukkan kepada kalian cara mengurutkan array objek berdasarkan nilai properti:

var persons = [
    { name: "Harry", age: 14 },
    { name: "Ethan", age: 30 },
    { name: "Peter", age: 21 },
    { name: "Clark", age: 42 },
    { name: "Alice", age: 16 }
];

// Sort by age
persons.sort(function (a, b) {
    return a.age - b.age;
});

console.log(persons);

// Sort by name
persons.sort(function(a, b) {
    var x = a.name.toLowerCase(); // ignore upper and lowercase
    var y = b.name.toLowerCase(); // ignore upper and lowercase
    if(x < y) {
        return -1;
    }
    if(x > y) {
        return 1;
    }
    // names must be equal
    return 0;
});

console.log(persons);