Javascript 对由数字组成的字符串数组进行排序

Javascript 对由数字组成的字符串数组进行排序,javascript,lodash,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) { v

我有以下数组,其中包含字符串

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

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

不幸的是,
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)

它看起来很整洁,但需要一些跨浏览器测试。

不幸的是,
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)

这看起来不错,但需要一些跨浏览器测试。

我又添加了一些日期作为证明

let data=[“2018-1”、“2018-5”、“2018-11”、“2018-2”、“2018-10”、“2018-12”、“2017-5”、“2019-12”];
var结果=数据。排序((a,b)=>{
风险值n1=a.分割(“-”);
var n2=b.分割(“-”);
n1=parseInt(n1[0])*100+parseInt(n1[1]);
n2=parseInt(n2[0])*100+parseInt(n2[1]);
返回n1-n2;
})

控制台日志(结果)我又添加了一些日期作为证据

let data=[“2018-1”、“2018-5”、“2018-11”、“2018-2”、“2018-10”、“2018-12”、“2017-5”、“2019-12”];
var结果=数据。排序((a,b)=>{
风险值n1=a.分割(“-”);
var n2=b.分割(“-”);
n1=parseInt(n1[0])*100+parseInt(n1[1]);
n2=parseInt(n2[0])*100+parseInt(n2[1]);
返回n1-n2;
})

控制台日志(结果)您可以为年份和月份链接分割的三角洲

var数据=[“2018-1”、“2018-5”、“2018-11”、“2018-2”、“2018-10”、“2018-12”、“2017-5”、“2019-12”],
结果=数据。排序((a,b)=>{
var aa=a.拆分(“-”),
bb=b.拆分(“-”);
返回aa[0]-bb[0]| | aa[1]-bb[1];
});

控制台日志(结果)您可以为年份和月份链接分割的三角洲

var数据=[“2018-1”、“2018-5”、“2018-11”、“2018-2”、“2018-10”、“2018-12”、“2017-5”、“2019-12”],
结果=数据。排序((a,b)=>{
var aa=a.拆分(“-”),
bb=b.拆分(“-”);
返回aa[0]-bb[0]| | aa[1]-bb[1];
});

控制台日志(结果)
您能告诉我们“此代码不工作”是什么意思吗?为什么不在数组上使用内置的JavaScript
.sort()
方法?它比lodash排序更灵活。小于10个月缺少前导零使排序更复杂。最简单的解决方案是使用前导零作为月数,并直接使用日期字符串。我得到的第一个错误是
Uncaught ReferenceError:uu未定义
你说“此代码不工作”是什么意思,请告诉我错误,这个问题的问题是,你的日期是一个小范围的可排序格式,但是,您可以将其更改为最终结果的不可排序格式。现在的问题是一种哲学方法,可以将原始给定的格式正确的日期更改回错误的但需要的日期,或者只是使用格式正确的日期,然后将日期更改为所需的格式。您能否告诉我们,“此代码不起作用”是什么意思?为什么不在数组上使用内置JavaScript
.sort()
方法?它比lodash排序更灵活。小于10个月缺少前导零使排序更复杂。最简单的解决方案是使用前导零作为月数,并直接使用日期字符串。我得到的第一个错误是
Uncaught ReferenceError:uu未定义
你说“此代码不工作”是什么意思,请告诉我错误,这个问题的问题是,你的日期是一个小范围的可排序格式,但是,您可以将其更改为最终结果的不可排序格式。现在的问题是一种哲学方法,将原始的给定格式更改为错误的,但需要的,或者只是使用格式良好的日期,然后将日期更改为想要的格式。