在JavaScript中按名字(字母顺序)排序数组

我得到了一个数组(见下面的数组中的一个对象),我需要使用JavaScript按名字排序。我该怎么做呢?< / p >

var user = {bio: null,email:  "user@domain.example",firstname: "Anna",id: 318,lastAvatar: null,lastMessage: null,lastname: "Nickson",nickname: "anny"};
1228755 次浏览

就像这样:

array.sort(function(a, b){var nameA = a.name.toLowerCase(), nameB = b.name.toLowerCase();if (nameA < nameB) //sort string ascendingreturn -1;if (nameA > nameB)return 1;return 0; //default return value (no sorting)});

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

它应该会返回

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

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

例子:

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

这段代码适用于任何类型。

注意,在“real life”中,当你比较字符串时,你经常想忽略大小写,正确排序变音符,像ß这样奇怪的符号,等等,所以你可能想使用localeCompare。请看其他答案。

基本上你可以用sort方法对数组排序,但如果你想对对象排序,你就必须传递function给数组的sort方法,我会给你一个使用数组的例子

user = [{bio: "<null>",email: "user@domain.example",firstname: "Anna",id: 318,last_avatar: "<null>",last_message: "<null>",lastname: "Nickson",nickname: "anny",},{bio: "<null>",email: "user@domain.example",firstname: "Senad",id: 318,last_avatar: "<null>",last_message: "<null>",lastname: "Nickson",nickname: "anny",},{bio: "<null>",email: "user@domain.example",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;});

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

users.sort(function(a,b){return a.firstname.localeCompare(b.firstname);})

underscorejs提供了非常好的_。sortBy功能:

_.sortBy([{a:1},{a:3},{a:2}], "a")

或者你可以使用自定义排序函数:

_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})

更紧凑的表示法:

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

您可以使用内置数组方法sort。该方法以一个回调方法作为参数


// custom sort function to be passed as param/callback to the Array's sort methodfunction myCustomSort(a, b) {return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;}
// Actual method to be called by entity that needs sorting featurefunction sortStrings() {var op = Array.prototype.sort.call(arguments, myCustomSort);}
// Testing the implementationvar sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]

理解这段代码需要注意的要点。

  1. 自定义方法(在本例中为myCustomSort)对于每个元素对(来自输入数组)比较应该返回+1或-1。
  2. 在自定义排序回调方法中使用toLowerCase()/toUpperCase(),以便大小写差异不会影响排序过程的正确性。

我希望这个解释足够清楚。如果你认为需要更多信息,请随意评论。

干杯!

你可以使用类似的方法来去除区分大小写的

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

把最上面的答案推到一个原型中按键排序。

Array.prototype.alphaSortByKey= function (key) {this.sort(function (a, b) {if (a[key] < b[key])return -1;if (a[key] > b[key])return 1;return 0;});return this;};

漂亮的小ES6内衬:

users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);

使用ES6的最短代码!

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

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

简单地说,你可以使用这种方法

users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});

您可以将此用于对象

transform(array: any[], field: string): any[] {return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);}

我们可以使用localeCompare,但也需要检查键是否有假值

如果一个条目缺少lname,下面的代码将无法工作。

obj.sort((a, b) => a.lname.localeCompare(b.lname))

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

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

受到第0个答案的启发,

users.sort((a,b) => (a.firstname  - b.firstname));

同样适用于asec和desc排序,你可以使用这个:假设我们有一个变量SortType,指定升序排序或降序排序:

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

如果我们要对名称或带有特殊字符的东西进行排序,比如n五个母音字母(西班牙语中的通用字符),我们可以使用参数地区(西班牙语中的西文)和选项,如下所示:

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(法语)中找到。关于灵敏度 基地意味着:

只有基本字母不同的字符串比较为不相等。例如:a≠b, a = á, a = a。

一个广义函数可以这样写

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

您可以传递以下参数

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

试一试

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) );

我的实现,在旧的ES版本中工作得很好:

sortObject = function(data) {var keys = Object.keys(data);var result = {};
keys.sort();
for(var i = 0; i < keys.length; i++) {var key = keys[i];
result[key] = data[key];}
return result;};

只是为了记录,如果你想有一个命名排序函数,语法如下:

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

请注意,以下是无效的:

users.sort(sortFunction(a,b))

我很惊讶居然没人提到Collators。除非迫不得已,否则不应该使用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;}

对于一个双因素排序(姓名和姓氏):

users.sort((a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : a.name.toLowerCase() > b.name.toLowerCase() ? 1 : a.lastname.toLowerCase() < b.lastname.toLowerCase() ? -1 : a.lastname.toLowerCase() > b.lastname.toLowerCase() ? 1 : 0)