我有一个数组(请参阅下面的数组中的一个对象),我需要使用JavaScript对firstname进行排序。 我该怎么办?
var user = {
bio: null,
email: "user@domain.com",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
答案 0 :(得分:847)
假设您有一个数组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
。请参阅其他答案以获得清晰度。
答案 1 :(得分:307)
这样的事情:
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)
});
答案 2 :(得分:290)
如果比较字符串包含unicode字符,您可以使用String
类的localeCompare
function,如下所示:
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
答案 3 :(得分:268)
ES6最短的代码!
users.sort((a, b) => a.firstname.localeCompare(b.firstname))
String.prototype.localeCompare()基本支持是普遍的!
答案 4 :(得分:24)
漂亮的小ES6单线:
users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
答案 5 :(得分:18)
我们可以使用localeCompare但需要检查键以及falsey值
如果一个条目缺少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())));
&#13;
OR
我们可以使用lodash,它非常简单。它将检测返回的值,即数字或字符串,并相应地进行排序。
import sortBy from 'lodash/sortBy';
sortBy(obj,'name')
答案 6 :(得分:15)
underscorejs提供了非常好的_.sortBy函数:
_.sortBy([{a:1},{a:3},{a:2}], "a")
或者您可以使用自定义排序功能:
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})
答案 7 :(得分: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;
});
答案 8 :(得分:8)
如果我们要对名称或带有特殊字符的内容进行排序,例如ñ或áéíóú(西班牙语常见),我们可以使用参数语言环境(在这种情况下为 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(法语)中找到官方语言环境选项。关于sensitivity base 的意思是:
只有基本字母不同的字符串才被视为不相等。例如:a≠b,a =á,a = A。
答案 9 :(得分:6)
灵感来自this回答,
users.sort((a,b) => (a.firstname - b.firstname));
答案 10 :(得分:4)
对于asec和desc排序,您都可以使用: 假设我们有一个变量 SortType ,用于指定所需的升序或降序:
users.sort(function(a,b){
return sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare( b.firstName));
})
答案 11 :(得分:4)
通用函数可以像下面这样写
function getSortedData(data, prop, isAsc) {
return data.sort((a, b) => (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1));
}
您可以传递以下参数
答案 12 :(得分:3)
更紧凑的符号:
user.sort(function(a, b){
return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
答案 13 :(得分:3)
您可以将其用于对象
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);}
答案 14 :(得分:2)
将最佳答案推送到原型中,按键排序。
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;
};
答案 15 :(得分:1)
我很惊讶没有人提到Collator。除非必须这样做,否则不应该使用#!/exp/anaconda3/bin/python3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
file_name = 'junk.csv'
data = pd.read_csv(file_name)
print(data.describe())
plt.rcParams['axes.grid'] = True
fix, axs = plt.subplots(2,2, figsize=(15,10))
axs[0, 0].hist(data['START'], 100, density=True, facecolor='g', alpha=0.8)
axs[1, 0].scatter(data['FIRST'], data['SECOND'], facecolor='violet')
axs[0, 1].hist(data['FIRST'], 100, density=True, facecolor='r', alpha=0.8)
axs[1, 1].hist(data['SECOND'], 100, density=True, facecolor='b', alpha=0.8)
plt.show()
,因为它的性能会大大降低。
localeCompare
答案 16 :(得分:1)
仅作记录,如果要具有命名的排序功能,语法如下:
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))
答案 17 :(得分:1)
简单地说就是你可以使用这种方法
users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});
答案 18 :(得分: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()
,以便大小写差异不会影响排序过程的正确性。我希望这个解释清楚。如果您认为,请随时发表评论,需要更多信息。
干杯!
答案 19 :(得分:0)
尝试
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) );
答案 20 :(得分:0)
我的实现在旧版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;
};
答案 21 :(得分:0)
你可以使用类似的东西来摆脱区分大小写
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;
})
答案 22 :(得分:0)
对两个因素进行排序(名称和姓氏):
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)