[英]JavaScript sort array by 2 values
我有一个数组,我想按“id”和“date”从小到大排序。 我该怎么做才能正确?
示例:
var unsorted = [
{id: 1, date: "2015-01-18T15:00:00+01:00"},
{id: 1, date: "2015-01-18T14:30:00+01:00"},
{id: 2, date: "2015-01-18T10:00:00+01:00"},
{id: 1, date: "2015-01-18T16:00:00+01:00"},
{id: 3, date: "2015-01-18T14:15:00+01:00"},
{id: 2, date: "2015-01-18T14:00:00+01:00"}
]
应该返回:
var sorted = [
{id: 1, date: "2015-01-18T14:30:00+01:00"},
{id: 1, date: "2015-01-18T15:00:00+01:00"},
{id: 1, date: "2015-01-18T16:00:00+01:00"},
{id: 2, date: "2015-01-18T10:00:00+01:00"},
{id: 2, date: "2015-01-18T14:00:00+01:00"},
{id: 3, date: "2015-01-18T14:15:00+01:00"}
]
以下是使用array.sort的示例:
var arr = [ {id: 1, date: "2015-01-18T15:00:00+01:00"}, {id: 1, date: "2015-01-18T14:30:00+01:00"}, {id: 2, date: "2015-01-18T10:00:00+01:00"}, {id: 1, date: "2015-01-18T16:00:00+01:00"}, {id: 3, date: "2015-01-18T14:15:00+01:00"}, {id: 2, date: "2015-01-18T14:00:00+01:00"} ]; arr.sort(function(a,b){ if (a.id == b.id) return a.date.localeCompare(b.date); return a.id-b.id; }); // test for (var i in arr) { console.log(arr[i]); }
结果是:
Object {id: 1, date: "2015-01-18T14:30:00+01:00"}
Object {id: 1, date: "2015-01-18T15:00:00+01:00"}
Object {id: 1, date: "2015-01-18T16:00:00+01:00"}
Object {id: 2, date: "2015-01-18T10:00:00+01:00"}
Object {id: 2, date: "2015-01-18T14:00:00+01:00"}
Object {id: 3, date: "2015-01-18T14:15:00+01:00"}
你可以使用.sort()
:
var unsorted = [
{id: 1, date: "2015-01-18T15:00:00+01:00"},
{id: 1, date: "2015-01-18T14:30:00+01:00"},
{id: 2, date: "2015-01-18T10:00:00+01:00"},
{id: 1, date: "2015-01-18T16:00:00+01:00"},
{id: 3, date: "2015-01-18T14:15:00+01:00"},
{id: 2, date: "2015-01-18T14:00:00+01:00"}
];
var sorted = unsorted.sort(function(a, b) {
return a.id == b.id ?
new Date(a.date) - new Date(b.date) : a.id - b.id;
});
console.log(sorted);
输出:
[ { id: 1, date: '2015-01-18T14:30:00+01:00' },
{ id: 1, date: '2015-01-18T15:00:00+01:00' },
{ id: 1, date: '2015-01-18T16:00:00+01:00' },
{ id: 2, date: '2015-01-18T10:00:00+01:00' },
{ id: 2, date: '2015-01-18T14:00:00+01:00' },
{ id: 3, date: '2015-01-18T14:15:00+01:00' } ]
试一试
var sorted = unsorted.sort(function(a, b) {
return a.id === b.id ?
Date.parse(a.date) - Date.parse(b.date) :
a.id - b.id ;
});
说明
如果id
字段相等,我们想要返回date
字段的比较。
如果id
字段不相等,我们将返回id
字段的比较
Array.sort采用带有两个参数的函数来比较数组的两个元素。 如果此函数返回负数,则a放在b之前,如果它返回正数,则a放在b之前,如果它返回0,则它们保持不变。 在这里,我通过id比较它们,如果它们的ID相同,那么我按日期比较它们。
var unsorted = [{ id: 1, date: "2015-01-18T15:00:00+01:00" }, { id: 1, date: "2015-01-18T14:30:00+01:00" }, { id: 2, date: "2015-01-18T10:00:00+01:00" }, { id: 1, date: "2015-01-18T16:00:00+01:00" }, { id: 3, date: "2015-01-18T14:15:00+01:00" }, { id: 2, date: "2015-01-18T14:00:00+01:00" }]; unsorted.sort(function(a, b) { if (a.id < b.id) return -1; else if (a.id > b.id) return 1; else { if (a.date < b.date) return -1; else if (a.date > b.date) return 1; else return 0; } });
分而治之!
首先将输入数组缩减为id => object的映射,即:
var dataById = unsorted.reduce(function (soFar, value) { // Initialise the array if we haven't processed this // id yet. if (soFar[value.id] === undefined) { soFar[value.id] = []; } // ad this object to Array. soFar[value.id].push(value); return soFar; }, {});
现在,您可以通过循环对象的键对每个数组进行排序,请注意,这会修改dataById映射。
Object.keys(dataById).forEach(function (id) { dataById[id] = dataById[id].sort(); });
最后,您可以将所有数据组合在一起,再次迭代地图中的键。 请注意,javascript中的地图(对象)不保证其键的顺序,因此您可能希望在迭代之前首先将ID转储到数组:
var ids = Object.keys(dataById).sort(); // Reduce the ids into an Array of data. var ids.reduce(function (soFar, value) { return soFar.concat(dataById[id]); }, []);
不是解决问题的最有效方法,但希望它能为您提供一些思考过程的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.