Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 分类“;年/月“;字符串作为降序日期_Javascript_Sorting_Date - Fatal编程技术网

Javascript 分类“;年/月“;字符串作为降序日期

Javascript 分类“;年/月“;字符串作为降序日期,javascript,sorting,date,Javascript,Sorting,Date,我有一个对象数组,其中包含“年/月”作为字符串值。我将它们作为日期对象进行比较,但问题是,如果我比较年份和第一个月,它将失败,正如代码中所示:“2015”和“2015/1” const sortYearsMonthsDescending=(items)=>items.sort((a,b)=>(新日期(a.value)-新日期(b.value)); const toBeSortedWorking=[{value:“2015”},{value:“2015/3”},{value:“2015/10”}

我有一个对象数组,其中包含“年/月”作为字符串值。我将它们作为日期对象进行比较,但问题是,如果我比较年份和第一个月,它将失败,正如代码中所示:“2015”和“2015/1”

const sortYearsMonthsDescending=(items)=>items.sort((a,b)=>(新日期(a.value)-新日期(b.value));
const toBeSortedWorking=[{value:“2015”},{value:“2015/3”},{value:“2015/10”}];
const toBeSortedNotWorking=[{value:“1933”},{value:“1933/11”},{value:“1933/1”}];
console.log(sortYearsMonthsDescending(toBeSortedWorking));
console.log(sortYearsMonthsDescending(toBeSortedNotWorking))
let dates=['2012','2018/1','2018','2014/3','2015','2012/5','2019','2013/7','2011/3','2010/10','2039/3'];
函数比较(日期1、日期2){
for(设i=0;idate2[i])返回1;
否则如果(date1[i]console.log(dates.sort(compareDates))
您可以轻松地执行此操作,因为
日期
是一个
可比较的对象

const a=[{value:“2015”},{value:“2015/3”},{value:“2015/10”}];
常量b=[{value:“1932”},{value:“1933/11”},{value:“1932/1”}];
功能排序(项目){
退货项目
.排序((a,b)=>{
a=a.value.split('/');
b=b.值分割('/');
//月在索引=1,考虑为0
a[1]=a[1]?(a[1]-1):0;
b[1]=b[1]?(b[1]-1):0;
/*ASC*/申报表(新日期(…a))-(新日期(…b));
/*描述/返回(新日期(…b))-(新日期(…a));
})
;
}
log('a=',sort(a));

log('b=',sort(b))无法以区分是否为月份提供值的方式初始化日期,因为它使用默认值来创建有效日期

在这个特定的用例中,我认为您可以添加日期字符串长度的二次计算,如下所示:

const sortYearsMonthsDescending = (items) => items.sort((a, b) => 
  (new Date(a.value) - new Date(b.value))) || (a.value.length - b.value.length);

基本上,这是一种边缘情况,即
“2015”
“2015/1”
之间存在歧义。我们用“在长字符串之前先取短字符串”的语句来解决这个歧义。请注意,为了扩展性的目的,bellow我还包括了day。如果根本不需要,则可以轻松移除

解决方案1-字符串排序键
YYYY-MM-DD-llll

下面的解决方案在不使用
Date
对象的情况下创建了一个排序键,并考虑了不带月份或日期的字符串应首先按升序排序

排序键是:
YYYY-MM-DD-LLLLL
,其中
L
是长度

const ensureDigits=(值,数字)=>{
return(Math.pow(10位)+value.toString().slice(-digits);
};
const sortDateStrings=(dateStrLst,降序)=>{
返回日期STRLST
.map(dateStr=>{
const parts=dateStr.value.split('/');
施工年份=零件[0];
const month=ensureDigits(第[1]| | 1,2部分);
const day=ensureDigits(第[2]部分| | 1,2);
const length=ensureDigits(dateStr.value.length,5);
返回{item:dateStr,sortKey:`${year}-${month}-${day}-${length}`}
})
.sort((模型1、模型2)=>
model1.sortKey.localeCompare(model2.sortKey)*(降序?-1:1))
.map(model=>model.item);
}
const dateStrLst1=[{value:“2015”},{value:“2015/3”},{value:“2015/10”}];
const dateStrLst2=[{value:“1932”},{value:“1933/11”},{value:“1932/1”}];
log(sortDateStrings(dateStrLst1.map)(item=>item.value));
log(sortDateStrings(dateStrLst2.map)(item=>item.value));
log(sortDateStrings(dateStrLst1,true).map(item=>item.value));

log(sortDateStrings(dateStrLst2,true).map(item=>item.value))您只需要以易于比较的格式获取字符串,无论是字符串还是日期。但是,使用日期会增加一个问题,即如何确保1933年在1932/12和1933/1之间正确排序

以下内容按字符串进行排序,将“/00”添加到任何仅为一年的值,并将前导零添加到一位数月份,以便将“2015/3”与“2015/03”进行比较

var values=[{value:“2015”},{value:“2015/3”},{value:“2015/10”},{value:“1933”},{value:“1932/12”},{value:“1933/11”},{value:“1933/1”};
log(JSON.stringify(values));
值。排序(函数(a,b){
功能固定月(日){
var t=日期分割('/');
返回t[0]+'/'+('0'+t[1]).slice(-2);
}
a=/\/.测试(a.值)?固定月份(a.值):a.值+'/00';
b=/\/.测试(b.值)?固定月份(b.值):b.值+'/00';
返回a.localeCompare(b);
})

log(JSON.stringify(values))排序时的年份应该是什么?年份应该总是排在第一位,就像这样:[{value:“1932”},{value:“1933/1”},{value:“1932/11”}];因此,添加一个检查,看看它是否没有“/”并将其推到顶部谢谢,是的,这将是一种方法,但我将看看是否有可能以这种方式实例化日期,以避免检查它是否是唯一的年份。这没有正确地对一位数和两位数的月份进行排序,例如2010/10和2010/2。你需要用一个前导零来填充一位数的月份,以使它们正确地按字符串排序。啊,很好。修复它并不困难,但会让它变得更混乱,而且我认为有足够多的解决方案可以正常工作。你不应该使用
newdate(a.value)
,因为像“2010/11”这样的字符串的解析完全依赖于实现。我想你是说“1932”将被解析为UTC,而“1932/1”将被解析为本地。但“1932/1”可能无法解析为有效的d