Answers:
假设您有一个数组users
。您可以使用users.sort
并传递一个接受两个参数并进行比较的函数(比较器)
它应该返回
在我们的情况下,如果两个元素是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
。
像这样:
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)
});
'a'>'A' //true
'z'>'a' //true
'A'>'z' //false
'Zebra'
高于字符串'apple'
(如果不使用,则将这样做)是很重要的.toLowerCase()
。
'Z' < 'a' // true
和'z' < 'a' // false
如果比较的字符串包含Unicode字符,则可以使用如下所示的class localeCompare
函数String
:
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
users.sort((a, b) => a.name.localeCompare(b.name))
我们可以使用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')
underscorejs提供了非常好的_.sortBy函数:
_.sortBy([{a:1},{a:3},{a:2}], "a")
或者您可以使用自定义排序功能:
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})
sortBy
检测到返回的值是字符串,从而执行字母排序?谢谢
如果我们正在对名称或带有特殊字符的内容(例如ñ或áéíóú(西班牙语中的常用字符))进行排序,则可以使用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)
可以在以下地址找到正式的语言环境选项:iana,es(西班牙语),de(德语),fr(法语)。关于灵敏度的 基础是:
只有基本字母不同的字符串才能比较为不相等。示例:a≠b,a =á,a =A。
基本上,您可以使用方法sort对数组进行排序,但是如果要对对象进行排序,则必须将函数传递给数组的排序方法,因此,我将为您提供使用数组的示例
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;
});
else
其删除吗?否则,return 0
将永远不会被读取
从这个答案中得到启发
users.sort((a,b) => (a.firstname - b.firstname));
更简洁的表示法:
user.sort(function(a, b){
return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
sign(f(a, b)) =-sign(f(b, a))
对于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));
})
[9,8,7,6,5,1,2,3].sort((a,b) => a<b ? -1 : 1)
您可以使用内置数组方法- sort
。此方法以回调方法为参数
// custom sort function to be passed as param/callback to the Array's sort method
function myCustomSort(a, b) {
return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;
}
// Actual method to be called by entity that needs sorting feature
function sortStrings() {
var op = Array.prototype.sort.call(arguments, myCustomSort);
}
// Testing the implementation
var sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");
console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]
要理解此代码要注意的关键点。
myCustomSort
应为每个元素对(来自输入数组)比较返回+1或-1。toLowerCase()
/ toUpperCase()
,以便区分大小写不会影响排序过程的正确性。我希望这是足够清楚的解释。如果您认为需要发表评论,则需要更多信息。
干杯!
您可以使用类似的方法来消除区分大小写
users.sort(function(a, b){
//compare two values
if(a.firstname.toLowerCase() < b.firstname.toLowerCase()) return -1;
if(a.firstname.toLowerCase() > b.firstname.toLowerCase()) return 1;
return 0;
})
仅作记录,如果您要具有命名的排序功能,语法如下:
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))