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
并传递一个带有两个参数的函数并进行比较(比较器)
它应该回来
在我们的例子中,如果有两个元素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;
})
Run Code Online (Sandbox Code Playgroud)
此代码适用于任何类型.
请注意,在"真实生活"™中,当您比较字符串时,您经常要忽略大小写,正确排序变音符号,奇怪的符号(如ß等),因此您可能需要使用localeCompare
.请参阅其他答案以获得清晰
Nac*_*tha 354
使用ES6的最短代码!
users.sort((a, b) => a.firstname.localeCompare(b.firstname))
Run Code Online (Sandbox Code Playgroud)
String.prototype.localeCompare()基本支持是通用的!
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)
ovu*_*tin 323
如果比较字符串包含unicode字符,则可以使用类的localeCompare
函数,String
如下所示:
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
Run Code Online (Sandbox Code Playgroud)
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)
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
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)
如果我们被分拣名称或特殊字符的东西,像ñ或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.
基本上你可以使用方法排序对数组进行排序,但是如果你想对对象进行排序,那么你必须将函数传递给数组的排序方法,所以我将给你一个使用你的数组的例子
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)
灵感来自这个答案,
users.sort((a,b) => (a.firstname - b.firstname));
Run Code Online (Sandbox Code Playgroud)
尝试
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)
我很惊讶没有人提到 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;
}
Run Code Online (Sandbox Code Playgroud)
更简洁的表示法:
user.sort(function(a, b){
return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
Run Code Online (Sandbox Code Playgroud)
一个广义函数可以写成如下
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)
您可以传递以下参数
同样对于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)
仅供记录,如果您想要一个命名的排序函数,语法如下:
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)
归档时间: |
|
查看次数: |
525581 次 |
最近记录: |