Adakah yang bisa membantu saya mengurutkan Array 2 dimensi di JavaScript?
Ini akan memiliki data dalam format berikut:
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
Ini akan terlihat seperti ini ketika diurutkan:
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
Jadi intinya, mengurutkan berdasarkan kolom pertama.
Bersulang
Jawaban:
Sesederhana ini:
var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']]; a.sort(sortFunction); function sortFunction(a, b) { if (a[0] === b[0]) { return 0; } else { return (a[0] < b[0]) ? -1 : 1; } }
Saya mengundang Anda untuk membaca dokumentasi .
Jika Anda ingin mengurutkan berdasarkan kolom kedua, Anda dapat melakukan ini:
a.sort(compareSecondColumn); function compareSecondColumn(a, b) { if (a[1] === b[1]) { return 0; } else { return (a[1] < b[1]) ? -1 : 1; } }
sumber
<
atau>
. Bagaimanapun, saya suka pembaruannya :)Pendekatan terbaik adalah menggunakan yang berikut ini, karena mungkin ada nilai berulang di kolom pertama.
var arr = [[12, 'AAA'], [12, 'BBB'], [12, 'CCC'],[28, 'DDD'], [18, 'CCC'],[12, 'DDD'],[18, 'CCC'],[28, 'DDD'],[28, 'DDD'],[58, 'BBB'],[68, 'BBB'],[78, 'BBB']]; arr.sort(function(a,b) { return a[0]-b[0] });
sumber
coba ini
//WITH FIRST COLUMN arr = arr.sort(function(a,b) { return a[0] - b[0]; }); //WITH SECOND COLUMN arr = arr.sort(function(a,b) { return a[1] - b[1]; });
Catatan: Jawaban asli menggunakan lebih besar dari (>) daripada minus (-) yang dirujuk oleh komentar sebagai salah.
sumber
Menggunakan fungsi panah, dan mengurutkan berdasarkan bidang string kedua
var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']]; a.sort((a, b) => a[1].localeCompare(b[1])); console.log(a)
sumber
Jika Anda seperti saya, Anda tidak akan ingin melalui perubahan setiap indeks setiap kali Anda ingin mengubah kolom yang Anda sortir.
function sortByColumn(a, colIndex){ a.sort(sortFunction); function sortFunction(a, b) { if (a[colIndex] === b[colIndex]) { return 0; } else { return (a[colIndex] < b[colIndex]) ? -1 : 1; } } return a; } var sorted_a = sortByColumn(a, 2);
sumber
Tidak ada yang istimewa, hanya menghemat biaya yang diperlukan untuk mengembalikan nilai pada indeks tertentu dari sebuah array.
function sortByCol(arr, colIndex){ arr.sort(sortFunction) function sortFunction(a, b) { a = a[colIndex] b = b[colIndex] return (a === b) ? 0 : (a < b) ? -1 : 1 } } // Usage var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']] sortByCol(a, 0) console.log(JSON.stringify(a)) // "[[12,"AAA"],[18,"DDD"],[28,"CCC"],[58,"BBB"]]"
sumber
a[colIndex]
lagi dan lagi tetapi saya menangkapnya di sinia = a[colIndex]
. Lebih efisien. 2. Saya menggunakan rasa yang berbedaif
, membuatnya lebih pendek. 3. Saya tidak kembaliarr
sebagai hasil darisortByCol
fungsi yang berarti fungsi saya tidak dapat digunakan untuk membuat referensi lain. Semoga membantu!dalam satu baris:
var cars = [ {type:"Volvo", year:2016}, {type:"Saab", year:2001}, {type:"BMW", year:2010} ] function myFunction() { return cars.sort((a, b)=> a.year - b.year) }
sumber
Jika Anda ingin mengurutkan berdasarkan kolom pertama (yang berisi nilai angka ), coba ini:
arr.sort(function(a,b){ return a[0]-b[0] })
Jika Anda ingin mengurutkan berdasarkan kolom kedua (yang berisi nilai string ), coba ini:
arr.sort(function(a,b){ return a[1].charCodeAt(0)-b[1].charCodeAt(0) })
PS untuk kasus kedua, Anda perlu membandingkan antara nilai ASCII mereka.
Semoga ini membantu.
sumber
Karena kasus penggunaan saya melibatkan lusinan kolom, saya memperluas jawaban @ jahroy sedikit. (juga baru menyadari @ charles-clayton memiliki ide yang sama.)
Saya meneruskan parameter yang ingin saya sortir, dan fungsi sortir didefinisikan ulang dengan indeks yang diinginkan untuk perbandingan berlangsung.
var ID_COLUMN=0 var URL_COLUMN=1 findings.sort(compareByColumnIndex(URL_COLUMN)) function compareByColumnIndex(index) { return function(a,b){ if (a[index] === b[index]) { return 0; } else { return (a[index] < b[index]) ? -1 : 1; } } }
sumber
Berdiri di atas bahu charles-clayton dan @ vikas-gautam, saya menambahkan uji string yang diperlukan jika kolom memiliki string seperti pada OP.
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ;
Tes
isNaN(a-b)
menentukan apakah string tidak dapat dipaksa menjadi angka. Jika bisa makaa-b
tes tersebut valid.Perhatikan bahwa mengurutkan kolom jenis campuran akan selalu memberikan hasil yang menghibur karena pengujian persamaan yang ketat
(a === b)
akan selalu menghasilkan nilai salah. Lihat MDN di siniIni adalah skrip lengkap dengan pengujian Logger - menggunakan Skrip Google Apps.
function testSort(){ function sortByCol(arr, colIndex){ arr.sort(sortFunction); function sortFunction(a, b) { a = a[colIndex]; b = b[colIndex]; return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ; // test if text string - ie cannot be coerced to numbers. // Note that sorting a column of mixed types will always give an entertaining result as the strict equality test will always return false // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness } } // Usage var a = [ [12,'12', 'AAA'], [12,'11', 'AAB'], [58,'120', 'CCC'], [28,'08', 'BBB'], [18,'80', 'DDD'], ] var arr1 = a.map(function (i){return i;}).sort(); // use map to ensure tests are not corrupted by a sort in-place. Logger.log("Original unsorted:\n " + JSON.stringify(a)); Logger.log("Vanilla sort:\n " + JSON.stringify(arr1)); sortByCol(a, 0); Logger.log("By col 0:\n " + JSON.stringify(a)); sortByCol(a, 1); Logger.log("By col 1:\n " + JSON.stringify(a)); sortByCol(a, 2); Logger.log("By col 2:\n " + JSON.stringify(a)); /* vanilla sort returns " [ [12,"11","AAB"], [12,"12","AAA"], [18,"80","DDD"], [28,"08","BBB"], [58,"120","CCC"] ] if col 0 then returns "[ [12,'12',"AAA"], [12,'11', 'AAB'], [18,'80',"DDD"], [28,'08',"BBB"], [58,'120',"CCC"] ]" if col 1 then returns "[ [28,'08',"BBB"], [12,'11', 'AAB'], [12,'12',"AAA"], [18,'80',"DDD"], [58,'120',"CCC"], ]" if col 2 then returns "[ [12,'12',"AAA"], [12,'11', 'AAB'], [28,'08',"BBB"], [58,'120',"CCC"], [18,'80',"DDD"], ]" */ }
sumber