排序由数字组成的字符串数组

时间:2018-03-19 18:30:58

标签: javascript lodash

我有以下包含字符串的数组;

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]];
});

你能告诉我为什么这段代码不起作用以及如何修复它?感谢。

3 个答案:

答案 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);