我有一个具有几个键值对的对象数组,我需要根据'updated_at'对它们进行排序:
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
最有效的方法是什么?
我说得有点晚了,但在2021年,正确的答案是使用inter . collator。updated_at是一个ISO-8601字符串,因此可以作为字符串进行排序。转换为Date是一种浪费时间的操作,如果手动比较返回0、1或-1也是如此。
const arr = [
{
"updated_at": "2012-01-01T06:25:24Z",
"foo": "bar"
},
{
"updated_at": "2012-01-09T11:25:13Z",
"foo": "bar"
},
{
"updated_at": "2012-01-05T04:13:24Z",
"foo": "bar"
}
];
const { compare } = Intl.Collator('en-US');
arr.sort((a, b) => compare(a.updated_at, b.updated_at));
Intl。Collator返回一个函数,可以用作#Array.sort的compareFunction。因为我们在对一个对象排序,所以我们调用compare函数与我们要排序的键的值进行比较。
注意,如果我们对一个字符串数组排序,我们可以简单地这样做:
arr.sort(compare);
还要注意,正如其他人指出的那样,sort会使原始数组发生变异。如果这是不可取的,您可能希望首先克隆它。在2021年,你可以这样做:
[...arr].sort((a, b) => compare(a.updated_at, b.updated_at));
使用下划线js或lodash,
var arrObj = [
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
];
arrObj = _.sortBy(arrObj,"updated_at");
_.sortBy()返回一个新数组
请参阅http://underscorejs.org/#sortBy和
lodash docs https://lodash.com/docs#sortBy
我已经在Typescript中创建了一个排序函数,我们可以使用它来搜索字符串,日期和对象数组中的数字。它还可以对多个字段进行排序。
export type SortType = 'string' | 'number' | 'date';
export type SortingOrder = 'asc' | 'desc';
export interface SortOptions {
sortByKey: string;
sortType?: SortType;
sortingOrder?: SortingOrder;
}
class CustomSorting {
static sortArrayOfObjects(fields: SortOptions[] = [{sortByKey: 'value', sortType: 'string', sortingOrder: 'desc'}]) {
return (a, b) => fields
.map((field) => {
if (!a[field.sortByKey] || !b[field.sortByKey]) {
return 0;
}
const direction = field.sortingOrder === 'asc' ? 1 : -1;
let firstValue;
let secondValue;
if (field.sortType === 'string') {
firstValue = a[field.sortByKey].toUpperCase();
secondValue = b[field.sortByKey].toUpperCase();
} else if (field.sortType === 'number') {
firstValue = parseInt(a[field.sortByKey], 10);
secondValue = parseInt(b[field.sortByKey], 10);
} else if (field.sortType === 'date') {
firstValue = new Date(a[field.sortByKey]);
secondValue = new Date(b[field.sortByKey]);
}
return firstValue > secondValue ? direction : firstValue < secondValue ? -(direction) : 0;
})
.reduce((pos, neg) => pos ? pos : neg, 0);
}
}
}
用法:
const sortOptions = [{
sortByKey: 'anyKey',
sortType: 'string',
sortingOrder: 'asc',
}];
arrayOfObjects.sort(CustomSorting.sortArrayOfObjects(sortOptions));
你可以使用Lodash实用程序库来解决这个问题(它是一个非常有效的库):
Const data = [{
“updated_at”:“2012 - 01 - 01 t06:25:24z”,
“foo”:“酒吧”
},
{
“updated_at”:“2012 - 01 - 09年t11:25:13z”,
“foo”:“酒吧”
},
{
“updated_at”:“2012 - 01 - 05 t04:13:24z”,
“foo”:“酒吧”
}
]
const ordered = _.orderBy(
数据,
函数(项){
返回item.updated_at;
}
);
console.log(命令)
< script src = " https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js " > < /脚本>
你可以在这里找到文档:https://lodash.com/docs/4.17.15#orderBy
正如这个答案所示,你可以使用Array.sort。
arr.sort(函数(a,b){返回新的日期(a.updated_at) -新的日期(b.updated_at)})
Arr = [
{
"updated_at": "2012-01-01 t6:25:24 z ",
"foo": "bar"
},
{
"updated_at": "2012-01-09T11:25:13Z",
"foo": "bar"
},
{
"updated_at": "2012-01-05T04:13:24Z",
"foo": "bar"
}
];
arr.sort(函数(a,b){返回新的日期(a.updated_at) -新的日期(b.updated_at)});
console.log (arr);