在Javascript中按名字(按字母顺序)对数组进行排序

IT技术 javascript
2021-01-25 01:17:22

我有一个数组(数组中的一个对象见下文),我需要使用 JavaScript 按名字排序。我该怎么做?

var user = {
   bio: null,
   email:  "user@domain.com",
   firstname: "Anna",
   id: 318,
   lastAvatar: null,
   lastMessage: null,
   lastname: "Nickson",
   nickname: "anny"
};
6个回答

假设您有一个数组users您可以使用users.sort并传递一个接受两个参数并比较它们的函数(比较器)

它应该返回

  • 如果第一个参数小于第二个,则为负数(应放在结果数组中的第二个之前)
  • 如果第一个参数更大,则为正数(应放在第二个参数之后)
  • 如果这两个元素相等,则为 0。

在我们的例子中,如果两个元素是a并且b我们想要比较a.firstnameb.firstname

例子:

users.sort(function(a, b){
    if(a.firstname < b.firstname) { return -1; }
    if(a.firstname > b.firstname) { return 1; }
    return 0;
})

此代码适用于任何类型。

请注意,在“现实生活”™ 中,当您比较字符串时,您经常希望忽略大小写、正确排序变音符号、诸如 ß 之类的奇怪符号等,因此您可能需要使用localeCompare. 为清楚起见,请参阅其他答案。

Friggin 太棒了......我正在按 id 对节点列表进行排序......就像一个魅力。一吨!
2021-03-21 01:17:22
此代码仅适用于英语国家。在其他国家/地区,您应该将ovunccetin 的答案与localeCompare.
2021-03-22 01:17:22
@mlienau,我不会称之为更好或更糟。这只是另一个
2021-03-31 01:17:22
@RiaD 足够公平。只是想不出很多按字母顺序对项目进行排序的情况,包括大小写,其中“Zebra”出现在“apple”之前的列表中,会非常有用。
2021-03-31 01:17:22
对于以后进来的人,Mrchief 的答案更好,因为它不区分大小写。
2021-04-07 01:17:22

使用 ES6 的最短代码!

users.sort((a, b) => a.firstname.localeCompare(b.firstname))

String.prototype.localeCompare()基本支持是通用的!

如果您生活在 2017 年,这是迄今为止最好的答案
2021-03-18 01:17:22
也可能是 2019 年的最佳答案。
2021-03-18 01:17:22
啊天哪,2030年地球会发洪水,这只在山上有效。
2021-03-24 01:17:22
2020年可能吗?或naaa?
2021-03-27 01:17:22
如果您住在 2018 年,也是最佳答案;)
2021-04-05 01:17:22

像这样的东西:

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)
});
对字符串进行排序时,'toLowerCase()' 非常重要 - 大写字母可能会影响您的排序。
2021-03-15 01:17:22
@SimplGy 我认为它的影响比你认为的要多一些。例如,如已接受答案的评论中所述,重要的是要知道您的 sort 函数是否会将字符串排序'Zebra'高于 string 'apple',如果您不使用.toLowerCase().
2021-03-23 01:17:22
@PrinceTyke 是的,这是一个很好的案例。'Z' < 'a' // true'z' < 'a' // false
2021-04-01 01:17:22
所有有效的观点,我会说排序总是一种“取决于”的事情。如果您按名称排序,区分大小写可能无关紧要。在其他情况下可能会。无论如何,我认为一旦你掌握了核心思想,适应一个人的具体情况并不难。
2021-04-09 01:17:22
万一其他人想知道 toLowerCase 会产生什么影响,这并不多: 'a'>'A' //true 'z'>'a' //true 'A'>'z' //false
2021-04-10 01:17:22

如果比较的字符串包含 unicode 字符,您可以使用类的localeCompare函数String如下所示:

users.sort(function(a,b){
    return a.firstname.localeCompare(b.firstname);
})
@CORSAIR 所有主要 IE 浏览器都支持示例中的用法:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...LocaleCompare 也考虑了大小写,所以我认为这种实现应该被认为是最佳实践。
2021-03-18 01:17:22
users.sort((a, b) => a.firstname.localeCompare(b.firstname)) // 短 n 甜 ES6 版本!
2021-03-20 01:17:22
String.localeCompare 不支持 Safari 和 IE < 11 :)
2021-03-24 01:17:22
@CORSAIR 支持,只是不支持的第二个和第三个参数。
2021-03-28 01:17:22
坦克兄弟 在 ES6 中使用users.sort((a, b) => a.name.localeCompare(b.name))
2021-04-01 01:17:22

漂亮的小 ES6 单衬:

users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
这个是不完整的,因为它没有正确处理相等的值。
2021-03-28 01:17:22
当然,感谢您发现这一点,我添加了匹配值的检查
2021-04-04 01:17:22
不错,我想如果你真的想在一行上全部写完,嵌套的三元组会因为可读性而变得混乱
2021-04-08 01:17:22