我有一个具有几个键值对的对象数组,我需要根据'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"
}
]
最有效的方法是什么?
我面对同样的事情,所以我用一个通用的为什么处理这个,我为此建立了一个函数:
/ / example:
/ /阵列:[姓名:’idan’workerType:(3))、姓名:’stas’workerType: 5),姓名:’kirill’,workerType: (2))]
/ / keyField:’workerType’
// keysArray:[“4”、“3”、“2”、“5”、“6”]
sortByArrayOfKeys = (array, keyField, keysArray) => {
array.sort((a, b) => {
const aIndex = keysArray.indexOf(a[keyField])
const bIndex = keysArray.indexOf(b[keyField])
if (aIndex < bIndex) return -1;
if (aIndex > bIndex) return 1;
return 0;
})
}
为了完整起见,这里有一个sortBy的简短泛型实现:
function sortBy(list, keyFunc) {
return list.sort((a,b) => keyFunc(a) - keyFunc(b));
}
sortBy([{"key": 2}, {"key": 1}], o => o["key"])
注意,这里使用了就地排序的数组排序方法。
对于副本,您可以使用arr.concat()或arr.slice(0)或类似的方法来创建副本。
正如这个答案所示,你可以使用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);
使用下划线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
你可以创建一个闭包并这样传递它
这是我的例子
$.get('https://data.seattle.gov/resource/3k2p-39jp.json?$limit=10&$where=within_circle(incident_location, 47.594972, -122.331518, 1609.34)',
function(responce) {
var filter = 'event_clearance_group', //sort by key group name
data = responce;
var compare = function (filter) {
return function (a,b) {
var a = a[filter],
b = b[filter];
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
};
};
filter = compare(filter); //set filter
console.log(data.sort(filter));
});