ค้นหาเว็บไซต์

จัดเรียงอาเรย์ตามชื่อหน้า (เรียงตามตัวอักษร) ใน 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) );

บทความที่เกี่ยวข้อง