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

Jon*_*ark 556 javascript

我有一个数组(请参阅下面的数组中的一个对象),我需要使用JavaScript对firstname进行排序.我该怎么做?

var user = {
   bio: null,
   email:  "user@domain.com",
   firstname: "Anna",
   id: 318,
   lastAvatar: null,
   lastMessage: null,
   lastname: "Nickson",
   nickname: "anny"
};
Run Code Online (Sandbox Code Playgroud)

Ria*_*iaD 944

假设你有一个数组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;
})
Run Code Online (Sandbox Code Playgroud)

此代码适用于任何类型.

请注意,在"真实生活"™中,当您比较字符串时,您经常要忽略大小写,正确排序变音符号,奇怪的符号(如ß等),因此您可能需要使用localeCompare.请参阅其他答案以获得清晰

  • 对于那些以后来的人来说,Mrchief的答案更好,因为它不区分大小写. (72认同)
  • @mlienau,我不会把它称为更好或更糟.这只是另一个 (25认同)
  • @RiaD足够公平.只是想不出很多按字母顺序对项目进行排序的情况,包括套管,其中'斑马'出现在'apple'之前的列表中,会非常有用. (17认同)
  • 此代码仅适用于英语国家/地区.在其他国家,您应该使用[ovutcetin的答案与`localeCompare`](http://stackoverflow.com/a/16481400/3713). (13认同)
  • Friggin真棒......我正在按ID排序节点列表......就像魅​​力一样.好一吨! (5认同)
  • 在三元组中:`users.sort(function(a,b){return(a> b?1:(a === b?0:-1))})` (3认同)
  • 不要忘记使用相同的文本大小写(例如'toLowerCase()')。 (2认同)

Nac*_*tha 354

使用ES6的最短代码!

users.sort((a, b) => a.firstname.localeCompare(b.firstname))
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你住在2018年也是最好的答案;) (42认同)
  • 可能也是2019年的最佳答案. (36认同)
  • 已经是 2020 年了,这是今年发生的唯一好事 (21认同)
  • 如果你住在2017年,到目前为止最好的答案 (16认同)
  • 2021 年最佳答案。它节省了我的工作时间 (15认同)
  • 是的,2020 年仍然是一个很好的答案 (14认同)
  • @chovy `users.sort((a, b) =&gt; -1 * a.firstname.localeCompare(b.firstname))` 只需将其乘以 `-1` (14认同)
  • 抱歉,剧透是2025年,我可以确认这项工作 (10认同)
  • 可能2020年?还是naaa? (7认同)
  • 2021 年,仍然没有人更好,没有人更伟大。 (7认同)
  • *种类*?!2021 年我们不需要** *排序*! (4认同)
  • 这里是 2030 年……这在人类水下总部也同样有效。 (4认同)
  • 感谢Zeus的函数式编程. (3认同)
  • 啊,伙计,到2030年,大地将泛滥成灾,这只能在山区进行。 (3认同)
  • 我喜欢我们书呆子也有气候意识 (3认同)
  • 5050,它单枪匹马无数次拯救了人类 (3认同)
  • 人们应该意识到,对于大数据集,这可能会更慢。如果这是关键代码,我建议进行基准测试 (3认同)
  • 运行良好,在火星上也运行良好:D (3认同)
  • 2021 对此表示感谢。 (3认同)
  • 如何逆序? (3认同)
  • 2019年......这仍然是最好的答案 (2认同)
  • 仅仅浪费了3个小时就试图让我能找到的所有其他东西都起作用(与php之类的东西相比,对javascript数组进行排序是可怕的)。我得到了错误的结果,没有结果,正在拔头发。终于找到了这个答案,它开箱即用。非常感谢OP。在2019年进行此操作的任何其他人都可以直接前往此答案,从而可以避免头痛。 (2认同)
  • 现在已经是 2020 年了,是的,这仍然是迄今为止最好的答案! (2认同)
  • 也许永远是最好的答案? (2认同)
  • 2022 年仍然有效,谢谢 (2认同)
  • 第 900 票赞成。现在完全值得被标记为正确答案,来吧! (2认同)

Mrc*_*ief 335

像这样的东西:

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)
});
Run Code Online (Sandbox Code Playgroud)

  • 排序字符串'toLowerCase()'非常重要 - 大写字母可能会影响您的排序. (42认同)
  • @SimplGy我认为它的影响比你给它的信誉要多一点.例如,正如对已接受答案的评论中所述,重要的是要知道你的排序函数是否将字符串"Zebra"排序为高于字符串"'apple"的字符串,如果你不这样做,它将会这样做.使用`.toLowerCase()`. (13认同)
  • 如果其他人想知道toLowerCase会影响什么,那就不多了:''a'>'A'// true``'z'>'a'// true``'A'>'z'// false ` (3认同)
  • 所有有效点,我会说排序总是"依赖于"这种事情.如果您按名称排序,则区分大小写可能无关紧要.在其他情况下它可能.无论如何,一旦你掌握了核心理念,我认为采用一个人的具体情况并不难. (2认同)

ovu*_*tin 323

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

users.sort(function(a,b){
    return a.firstname.localeCompare(b.firstname);
})
Run Code Online (Sandbox Code Playgroud)

  • 支持@CORSAIR,它只是不受支持的第二个和第三个参数. (13认同)
  • users.sort((a,b)=> a.firstname.localeCompare(b.firstname))//短n甜ES6版本! (9认同)
  • @CORSAIR所有主要的IE浏览器都支持该示例中的用法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare.LocaleCompare还考虑了大小写,因此我认为这种实现应被视为最佳实践. (6认同)
  • String.localeCompare不支持Safari和IE <11 :) (3认同)
  • 坦克兄弟.在ES6中使用`users.sort((a,b)=> a.name.localeCompare(b.name))` (3认同)

Sam*_*gan 25

漂亮的小ES6单线:

users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
Run Code Online (Sandbox Code Playgroud)

  • 还不错,我想如果你真的想把它全部写在一行上,嵌套的三元组会导致可读性混乱 (3认同)
  • 这个是不完整的,因为它没有正确处理相等的值. (2认同)
  • 当然,感谢您发现这一点,我添加了匹配值的检查 (2认同)

sum*_*mit 22

我们可以使用localeCompare但需要检查键以及falsey值

如果一个条目缺少lname,则下面的代码将不起作用.

obj.sort((a, b) => a.lname.localeCompare(b.lname))
Run Code Online (Sandbox Code Playgroud)

所以我们需要检查下面的假值

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())));
Run Code Online (Sandbox Code Playgroud)

要么

我们可以使用lodash,它非常简单.它将检测返回的值,即数字或字符串,并相应地进行排序.

import sortBy from 'lodash/sortBy';
sortBy(obj,'name')
Run Code Online (Sandbox Code Playgroud)

https://lodash.com/docs/4.17.5#sortBy

  • Lodash很整洁!以前没有听说过。很棒! (2认同)

Ped*_* T. 15

underscorejs提供了非常好的_.sortBy函数:

_.sortBy([{a:1},{a:3},{a:2}], "a")
Run Code Online (Sandbox Code Playgroud)

或者您可以使用自定义排序功能:

_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})
Run Code Online (Sandbox Code Playgroud)

  • 第二个例子涉及返回字符串.`sortBy`是否检测到返回的值是字符串,从而执行字母排序?谢谢 (2认同)

Eme*_*eus 9

如果我们被分拣名称或特殊字符的东西,像ñAEIOU(西班牙公共),我们可以使用PARAMS 语言环境(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)
Run Code Online (Sandbox Code Playgroud)

可以在iana,es(西班牙语),de(德语),fr(法语)中找到官方语言环境选项.关于敏感度 基础是指:

只有基本字母不同的字符串才会比较为不相等.示例:a≠b,a =á,a = A.


Sen*_*kin 8

基本上你可以使用方法排序对数组进行排序,但是如果你想对对象进行排序,那么你必须将函数传递给数组的排序方法,所以我将给你一个使用你的数组的例子

user = [{
bio: "<null>",
email: "user@domain.com",
firstname: 'Anna',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Senad',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
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;
});
Run Code Online (Sandbox Code Playgroud)

  • 那不是"别的",它是"别的如果" (2认同)

Isu*_*ana 8

灵感来自这个答案,

users.sort((a,b) => (a.firstname  - b.firstname));
Run Code Online (Sandbox Code Playgroud)

  • 错错错了!如果在 Javascript 中减去字符串,则不会得到有效结果。 (4认同)

Kam*_*ski 7

尝试

users.sort((a,b)=> (a.firstname>b.firstname)*2-1)
Run Code Online (Sandbox Code Playgroud)

users.sort((a,b)=> (a.firstname>b.firstname)*2-1)
Run Code Online (Sandbox Code Playgroud)

  • 排序函数应该返回 -1,0,1。这个只返回-1,1。 (3认同)

Dom*_*nic 7

我很惊讶没有人提到 Collat​​ors。localeCompare除非必须,否则不应使用,因为它的性能要差得多。

const collator = new Intl.Collator('zh-CN'); // Chinese Simplified for example

function sortAsc(a, b) {
  if (typeof a === 'string' && typeof b === 'string') {
    return collator.compare(b, a)
  }

  return b - a;
}

function sortDesc(a, b) {
  if (typeof a === 'string' && typeof b === 'string') {
    return collator.compare(a, b);
  }

  return a - b;
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ley 6

更简洁的表示法:

user.sort(function(a, b){
    return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
Run Code Online (Sandbox Code Playgroud)

  • 返回`a.firstname == b.firstname`应该使用`===`以确保完整性 (2认同)

San*_*osh 6

一个广义函数可以写成如下

    function getSortedData(data, prop, isAsc) {
        return data.sort((a, b) => (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1));
   }
Run Code Online (Sandbox Code Playgroud)

您可以传递以下参数

  1. 要排序的数据
  2. 应该对数据中的属性进行排序
  3. 最后一个参数是布尔类型。它检查您是要按升序还是按降序排序


gha*_*eri 5

同样对于asec和desc排序,您都可以使用此方法:假设我们有一个变量SortType,它指定了所需的升序或降序排序:

 users.sort(function(a,b){
            return   sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare(  b.firstName));
        })
Run Code Online (Sandbox Code Playgroud)


Kat*_*ink 5

仅供记录,如果您想要一个命名的排序函数,语法如下:

let sortFunction = (a, b) => {
 if(a.firstname < b.firstname) { return -1; }
 if(a.firstname > b.firstname) { return 1; }
 return 0;
})
users.sort(sortFunction)
Run Code Online (Sandbox Code Playgroud)

请注意,以下内容不起作用:

users.sort(sortFunction(a,b))
Run Code Online (Sandbox Code Playgroud)