มีใครช่วยจัดเรียง Array 2 มิติใน JavaScript ได้ไหม
จะมีข้อมูลในรูปแบบต่อไปนี้:
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
ควรมีลักษณะดังนี้เมื่อจัดเรียง:
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
โดยพื้นฐานแล้วเรียงตามคอลัมน์แรก
ไชโย
มีใครช่วยจัดเรียง Array 2 มิติใน JavaScript ได้ไหม
จะมีข้อมูลในรูปแบบต่อไปนี้:
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
ควรมีลักษณะดังนี้เมื่อจัดเรียง:
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
โดยพื้นฐานแล้วเรียงตามคอลัมน์แรก
ไชโย
คำตอบ:
มันง่ายมาก:
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;
}
}
หากคุณต้องการจัดเรียงตามคอลัมน์ที่สองคุณสามารถทำได้:
a.sort(compareSecondColumn);
function compareSecondColumn(a, b) {
if (a[1] === b[1]) {
return 0;
}
else {
return (a[1] < b[1]) ? -1 : 1;
}
}
<
>
อย่างไรก็ตามฉันชอบการอัปเดต :)
แนวทางที่ดีที่สุดคือใช้สิ่งต่อไปนี้เนื่องจากอาจมีค่าซ้ำกันในคอลัมน์แรก
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]
});
ลองดู
//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];
});
หมายเหตุ: คำตอบเดิมใช้มากกว่า (>) แทนเครื่องหมายลบ (-) ซึ่งเป็นความคิดเห็นที่อ้างถึงว่าไม่ถูกต้อง
ใช้ฟังก์ชันลูกศรและจัดเรียงตามฟิลด์สตริงที่สอง
var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']];
a.sort((a, b) => a[1].localeCompare(b[1]));
console.log(a)
หากคุณเป็นเหมือนฉันคุณจะไม่ต้องการเปลี่ยนดัชนีทุกครั้งที่คุณต้องการเปลี่ยนคอลัมน์ที่คุณจัดเรียง
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);
ไม่มีอะไรพิเศษเพียงแค่ประหยัดค่าใช้จ่ายในการคืนค่าที่ดัชนีบางรายการจากอาร์เรย์
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"]]"
a[colIndex]
อีกครั้งและอีกครั้ง a = a[colIndex]
แต่ผมจับได้ที่นี่ มีประสิทธิภาพมากขึ้น 2. ฉันใช้รสชาติที่แตกต่างกันif
ทำให้สั้นลง 3. ฉันไม่ได้กลับมาarr
เนื่องจากsortByCol
ฟังก์ชันซึ่งหมายความว่าฟังก์ชันของฉันไม่สามารถใช้เพื่อสร้างข้อมูลอ้างอิงอื่นได้ หวังว่าจะช่วยได้!
ในหนึ่งบรรทัด:
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)
}
หากคุณต้องการที่จะเรียงลำดับขึ้นอยู่กับคอลัมน์แรก (ซึ่งมีจำนวนค่า) แล้วลองนี้
arr.sort(function(a,b){
return a[0]-b[0]
})
หากคุณต้องการจัดเรียงตามคอลัมน์ที่สอง (ซึ่งมีค่าสตริง ) ให้ลองทำดังนี้:
arr.sort(function(a,b){
return a[1].charCodeAt(0)-b[1].charCodeAt(0)
})
ป.ล. สำหรับกรณีที่สองคุณต้องเปรียบเทียบระหว่างค่า ASCII
หวังว่านี่จะช่วยได้
เนื่องจาก usecase ของฉันเกี่ยวข้องกับคอลัมน์หลายสิบคอลัมน์ฉันจึงขยายคำตอบของ @jahroy เล็กน้อย (ยังเพิ่งตระหนักว่า @ charles-clayton ก็มีความคิดเดียวกัน)
ฉันส่งผ่านพารามิเตอร์ที่ต้องการจัดเรียงและฟังก์ชันการเรียงลำดับจะถูกกำหนดใหม่ด้วยดัชนีที่ต้องการเพื่อให้การเปรียบเทียบเกิดขึ้น
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;
}
}
}
เมื่อยืนอยู่บนไหล่ของ charles-clayton และ @ vikas-gautam ฉันได้เพิ่มการทดสอบสตริงซึ่งจำเป็นหากคอลัมน์มีสตริงเหมือนใน OP
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ;
การทดสอบisNaN(a-b)
จะพิจารณาว่าสตริงไม่สามารถบังคับเป็นตัวเลขได้หรือไม่ หากทำได้การa-b
ทดสอบก็ใช้ได้
โปรดทราบว่าการจัดเรียงคอลัมน์แบบคละประเภทจะให้ผลลัพธ์ที่สนุกสนานเสมอเนื่องจากการทดสอบความเท่าเทียมกันอย่างเข้มงวด(a === b)
จะแสดงผลเท็จเสมอ
ดู MDN ที่นี่
นี่คือสคริปต์ฉบับเต็มพร้อมการทดสอบ Logger - โดยใช้ Google Apps Script
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"],
]"
*/
}