我有以下包含字符串的数组;
let data = ["2018-1", "2018-5", "2018-11", "2018-2", "2018-10", "2018-12"];
这些字符串由数字(年和月)组成。
你能告诉我为什么没有按照功能进行排序吗?我需要从最新日期到最旧日期对此数组进行排序。在这种情况下,从“2018-12”到“2018-1”。
我在整个项目中使用lodash所以我也尝试在这里使用它。
var result = _.sortBy(data, function(i) {
var x = i.split("-").map(Number);
return [x[0], x[1]];
});
你能告诉我为什么这段代码不起作用以及如何修复它?感谢。
答案 0 :(得分:2)
我添加了几个日期作为证据。
let data = ["2018-1", "2018-5", "2018-11", "2018-2", "2018-10", "2018-12", "2017-5", "2019-12"];
var result = data.sort((a, b) => {
var n1 = a.split("-");
var n2 = b.split("-");
n1 = parseInt(n1[0]) * 100 + parseInt(n1[1]);
n2 = parseInt(n2[0]) * 100 + parseInt(n2[1]);
return n1 - n2;
})
console.log(result);

答案 1 :(得分:1)
不幸的是,sortBy
不支持复合键,因此您的数组键将转换为字符串。解决方法是提供两个单独的密钥:
var result = _.sortBy(data, [
x => Number(x.split('-')[0]),
x => Number(x.split('-')[1]),
]);
或合成数字:
var result = _.sortBy(data, x => {
x = x.split('-');
return Number(x[0]) * 1000 + Number(x[1])
});
最后,您可以冒险尝试Date.parse
:
var result = _.sortBy(data, Date.parse)
看起来很整洁,但需要进行一些跨浏览器测试。
答案 2 :(得分:0)
您可以将拆分的增量链接到年份和月份。
var data = ["2018-1", "2018-5", "2018-11", "2018-2", "2018-10", "2018-12", "2017-5", "2019-12"],
result = data.sort((a, b) => {
var aa = a.split("-"),
bb = b.split("-");
return aa[0] - bb[0] || aa[1] - bb[1];
});
console.log(result);