我得到了一个数组(见下面数组中的一个对象),我需要使用JavaScript按名字排序。 我该怎么做呢?
var user = {
bio: null,
email: "user@domain.example",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
我得到了一个数组(见下面数组中的一个对象),我需要使用JavaScript按名字排序。 我该怎么做呢?
var user = {
bio: null,
email: "user@domain.example",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
当前回答
假设您有一个用户数组。你可以使用用户。排序并传递一个函数,该函数接受两个参数并进行比较(comparator)
它应该会返回
如果第一个参数小于第二个参数,则为负数(在结果数组中应放在第二个参数之前) 如果第一个参数更大,则为正(应放在第二个参数之后) 如果这两个元素相等,则为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。请看其他答案。
其他回答
我们可以使用localeCompare,但也需要检查键是否有假值
如果一个条目缺少lname,下面的代码将无法工作。
obj.sort((a, b) => a.lname.localeCompare(b.lname))
所以我们需要检查如下所示的假值
让obj = [ {名称:“约翰”,lname:“母鹿”,地址:“阿拉斯加”}, {lname名字:“汤姆”:“希望”,地址:“加州”}, {名称:“哈利”,地址:“德州”} ] 让字段=“lname”; console.log (obj。sort((a, b) => (a[field] || ""). tostring()。localeCompare((b[field] || "").toString())));
OR
我们可以使用lodash,非常简单。它将检测返回值,即数字或字符串,并相应地进行排序。
import sortBy from 'lodash/sortBy';
sortBy(obj,'name')
https://lodash.com/docs/4.17.5#sortBy
假设您有一个用户数组。你可以使用用户。排序并传递一个函数,该函数接受两个参数并进行比较(comparator)
它应该会返回
如果第一个参数小于第二个参数,则为负数(在结果数组中应放在第二个参数之前) 如果第一个参数更大,则为正(应放在第二个参数之后) 如果这两个元素相等,则为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。请看其他答案。
对于一个双因素排序(姓名和姓氏):
用户。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)
您可以将此用于对象
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);}
try
users.sort((a,b)=> (a.firstname>b.firstname)*2-1)
Var用户= [ {firstname:“Kate”,id: 318, /*…* /}, {名字:“安娜”,id: 319, /*…* /}, {名字:“christine”,id: 317, /*…* /}, ] Console.log (users.sort((a,b)=> (a.firstname>b.firstname)*2-1));