จัดเรียงอาเรย์ตามชื่อหน้า (เรียงตามตัวอักษร) ใน JavaScript
ฉันมีอาเรย์ (ดูด้านล่างสำหรับวัตถุหนึ่งในอาเรย์) ที่ฉันต้องการจัดเรียงตามชื่อแรกโดยใช้ JavaScript ฉันสามารถทำได้อย่างไร?
var user = {
bio: null,
email: "[email ",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
คำตอบ #1
โค้ดที่สั้นที่สุดเท่าที่จะเป็นไปได้ด้วย ES6!
users.sort((a, b) => a.firstname.localeCompare(b.firstname))
การสนับสนุนพื้นฐานของ String.prototype.localeCompare() เป็นสากล!
คำตอบ #2
สมมติว่าคุณมีอาร์เรย์ users คุณสามารถใช้ users.sort และส่งฟังก์ชันที่รับอาร์กิวเมนต์สองตัวและเปรียบเทียบพวกมัน (ตัวเปรียบเทียบ)
มันควรจะกลับมา
- ค่าติดลบหากอาร์กิวเมนต์ตัวแรกน้อยกว่าตัวที่สอง (ควรวางไว้ก่อนตัวที่สองในอาร์เรย์ที่ได้)
- บางสิ่งที่เป็นบวกถ้าอาร์กิวเมนต์ตัวแรกมากกว่า (ควรวางหลังตัวที่สอง)
- 0 ถ้าสององค์ประกอบนั้นเท่ากัน
ในกรณีของเรา ถ้าสององค์ประกอบคือ a และ b เราต้องการเปรียบเทียบ a.firstname และ b.firstname
ตัวอย่าง :
users.sort(function(a, b){
if(a.firstname < b.firstname) { return -1; }
if(a.firstname > b.firstname) { return 1; }
return 0;
})
โค้ดนี้จะทำงานกับทุกชนิด
โปรดสังเกตว่าใน "ชีวิตจริง"™ คุณมักจะต้องละเว้นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก จัดเรียงสระหรือเครื่องหมายวรรณยุกต์ให้ถูกต้อง สัญลักษณ์แปลก ๆ เช่น ß ฯลฯ เมื่อคุณเปรียบเทียบสตริง ดังนั้นคุณอาจต้องการใช้ localeCompare ตรวจสอบคำตอบอื่นๆ เพื่อความชัดเจน
คำตอบ #3
ถ้าสตริงที่เปรียบเทียบมีอักขระยูนิโค้ด คุณสามารถใช้ฟังก์ชัน localeCompare ของคลาส String ดังตัวอย่างต่อไปนี้:
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
คำตอบ #4
บางอย่างเช่นนี้:
array.sort(function(a, b){
var nameA = a.name.toLowerCase(), nameB = b.name.toLowerCase();
if (nameA < nameB) //sort string ascending
return -1;
if (nameA > nameB)
return 1;
return 0; //default return value (no sorting)
});
คำตอบ #5
โค้ด ES6 บรรทัดเดียวเล็ก ๆ น่ารัก:
users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
คำตอบ #6
เราสามารถใช้ localeCompare แต่ก็ต้องตรวจสอบคีย์ด้วยสำหรับค่าที่เป็น falsey
โค้ดด้านล่างจะไม่ทำงานหากรายการใดรายการหนึ่งขาด lname
obj.sort((a, b) => a.lname.localeCompare(b.lname))
ดังนั้นเราจำเป็นต้องตรวจสอบค่าที่เป็น falsey ดังตัวอย่างด้านล่าง
let obj=[
{name:'john',lname:'doe',address:'Alaska'},
{name:'tom',lname:'hopes',address:'California'},
{name:'harry',address:'Texas'}
]
let field='lname';
console.log(obj.sort((a, b) => (a[field] || "").toString().localeCompare((b[field] || "").toString())));หรือ
เราสามารถใช้ lodash ได้ มันง่ายมาก มันจะตรวจจับค่าที่ส่งกลับ เช่น ว่าเป็นตัวเลขหรือตัวอักษร และทำการจัดเรียงตามนั้น
import sortBy from 'lodash/sortBy';
sortBy(obj,'name')
https://lodash.com/docs/4.17.5#sortBy
คำตอบ #7
lodash และ underscorejs มีฟังก์ชัน _.sortBy ที่ดีมาก:
_.sortBy([{a:1},{a:3},{a:2}], "a")
หรือคุณสามารถใช้ฟังก์ชันการจัดเรียงแบบกำหนดเองได้:
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})
คำตอบ #8
ในกรณีที่เราเรียงลำดับชื่อหรือบางอย่างที่มีอักขระพิเศษ เช่น ñ หรือ áéíóú (ซึ่งมักพบในภาษาสเปน) เราสามารถใช้พารามิเตอร์ locales (es สำหรับภาษาสเปนในกรณีนี้) และ ตัวเลือก เช่นนี้:
let user = [{'firstname': 'Az'},{'firstname': 'Áb'},{'firstname':'ay'},{'firstname': 'Ña'},{'firstname': 'Nz'},{'firstname': 'ny'}];
user.sort((a, b) => a.firstname.localeCompare(b.firstname, 'es', {sensitivity: 'base'}))
console.log(user)ตัวเลือกภูมิภาคอย่างเป็นทางการสามารถพบได้ที่นี่ใน IANA, es (สเปน), de (เยอรมัน), fr (ฝรั่งเศส) เกี่ยวกับความไว base หมายถึง:
เฉพาะสตริงที่แตกต่างกันในอักขระฐานเท่านั้นที่ถือว่าไม่เท่ากัน ตัวอย่างเช่น: a ≠ b, a=á, a=A
คำตอบ #9
สัญลักษณ์ที่กระชับมากขึ้น:
user.sort(function(a, b){
return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
คำตอบ #10
ฉันประหลาดใจที่ไม่มีใครพูดถึง Collators คุณไม่ควรใช้ localeCompare เว้นแต่จำเป็นเพราะมันมีประสิทธิภาพที่แย่กว่ามาก
const collator = new Intl.Collator('zh-CN'); // Chinese Simplified for example
function sortAsc(a: string, b: string) {
return collator.compare(a, b)
}
function sortDesc(a: string, b: string) {
return collator.compare(b, a);
}
คำตอบ #11
โดยพื้นฐานแล้วคุณสามารถจัดเรียงอาเรย์ด้วยวิธี sort แต่ถ้าคุณต้องการจัดเรียงวัตถุ คุณจะต้องส่งฟังก์ชันไปยังวิธี sort ของอาเรย์ ดังนั้นฉันจะยกตัวอย่างให้คุณโดยใช้แอเรย์ของคุณ
user = [
{
bio: "<null>",
email: "[email ",
firstname: "Anna",
id: 318,
last_avatar: "<null>",
last_message: "<null>",
lastname: "Nickson",
nickname: "anny",
},
{
bio: "<null>",
email: "[email ",
firstname: "Senad",
id: 318,
last_avatar: "<null>",
last_message: "<null>",
lastname: "Nickson",
nickname: "anny",
},
{
bio: "<null>",
email: "[email ",
firstname: "Muhamed",
id: 318,
last_avatar: "<null>",
last_message: "<null>",
lastname: "Nickson",
nickname: "anny",
},
];
var ar = user.sort(function (a, b) {
var nA = a.firstname.toLowerCase();
var nB = b.firstname.toLowerCase();
if (nA < nB) return -1;
else if (nA > nB) return 1;
return 0;
});
คำตอบ #12
สั้นที่สุด
users.sort((a,b)=> (a.firstname>b.firstname)*2-1)
var users = [
{ firstname: "Kate", id: 318, /*...*/ },
{ firstname: "Anna", id: 319, /*...*/ },
{ firstname: "Cristine", id: 317, /*...*/ },
]
console.log(users.sort((a,b)=> (a.firstname>b.firstname)*2-1) );