按键为字符串日期对对象键值对进行排序
Sort object key-value pairs by keys being string dates
我是编码和尝试学习的新手,如果这个问题可能被重复发布,我深表歉意。我搜索了论坛,找到了一些提示,但没有找到解决方案。
我有一个看起来像这样的对象:
Dates: { '10/25/2019': 'sth',
'6/21/2017': 'sthelse',
'4/15/2016': 'anotherone',
'12/29/2015': 'wtf',
'8/18/2018': 'lol' }
我希望它按日期排序,从最晚到最旧。然而,日期键是一个字符串,最终结果应该是相同的。
我首先尝试用“/”拆分密钥,然后创建一个分数,其中 priority1 是年份,priority2 是月份,prio3 是日期,但它最终变成了意大利面条,我无法弄清楚。
所以我在论坛中找到了以下内容:
How to sort an object array by date property?
并试图弄清楚,但不幸的是失败了,因为我不是在对对象数组进行排序,而是在对对象本身进行排序。
这是我的解决方案
function sortthedates(unsorted){
sorteddates = {}
datesunsorted = unsorted;
key = Object.keys(datesunsorted);
value = Object.values(datesunsorted);
var sorted = key.sort((a, b) => {
return new Date(b) - new Date(a);
});
for (var y = 0; y < sorted.length; y++){
sorteddates[sorted[y]] = datesunsorted[sorted[y]];
}
return sorteddates;
}
它产生了正确的结果,但看起来很像意大利面条式代码而且效率低下。
有没有更简单、更短的方法来完成任务?
在此先感谢您的帮助:)
最好的问候
我发现以下内容更具可读性。从对象中获取键(a.k.a 日期),将对象中的每个条目映射到新的 'key'、'value' 对对象,然后按日期 属性 排序。
var dates = { '10/25/2019': 'sth',
'6/21/2017': 'sthelse',
'4/15/2016': 'anotherone',
'12/29/2015': 'wtf',
'8/18/2018': 'lol' };
var sorted = Object.keys(dates)
.map(k => ({ key: new Date(k), value: dates[k] }))
.sort((a,b) => a.key-b.key)
.reduce((cv,pv) => {
cv[pv.key] = pv.value;
return cv;
}, {});
console.log(sorted);
虽然我不太明白为什么对象中的属性顺序会有任何相关性(并且您不应该依赖它),但这应该可行
function sort(o) {
let keys = Object.keys(o)
.sort((a,b) => new Date(a).getTime() - new Date(b).getTime());
let r = {};
for (let k of keys) r[k] = o[k];
return r;
}
如果你喜欢reduce
,你可以在一条语句中完成
function sort(o) {
return Object.keys(o)
.sort((a,b) => new Date(a).getTime() - new Date(b).getTime())
.reduce((a, k) => {
a[k] = o[k];
return a;
}, {});
}
但是恕我直言,该循环更具可读性,并且没有真正看到在此处使用 reduce
的优势...
我是编码和尝试学习的新手,如果这个问题可能被重复发布,我深表歉意。我搜索了论坛,找到了一些提示,但没有找到解决方案。
我有一个看起来像这样的对象:
Dates: { '10/25/2019': 'sth',
'6/21/2017': 'sthelse',
'4/15/2016': 'anotherone',
'12/29/2015': 'wtf',
'8/18/2018': 'lol' }
我希望它按日期排序,从最晚到最旧。然而,日期键是一个字符串,最终结果应该是相同的。 我首先尝试用“/”拆分密钥,然后创建一个分数,其中 priority1 是年份,priority2 是月份,prio3 是日期,但它最终变成了意大利面条,我无法弄清楚。
所以我在论坛中找到了以下内容: How to sort an object array by date property? 并试图弄清楚,但不幸的是失败了,因为我不是在对对象数组进行排序,而是在对对象本身进行排序。
这是我的解决方案
function sortthedates(unsorted){
sorteddates = {}
datesunsorted = unsorted;
key = Object.keys(datesunsorted);
value = Object.values(datesunsorted);
var sorted = key.sort((a, b) => {
return new Date(b) - new Date(a);
});
for (var y = 0; y < sorted.length; y++){
sorteddates[sorted[y]] = datesunsorted[sorted[y]];
}
return sorteddates;
}
它产生了正确的结果,但看起来很像意大利面条式代码而且效率低下。
有没有更简单、更短的方法来完成任务?
在此先感谢您的帮助:) 最好的问候
我发现以下内容更具可读性。从对象中获取键(a.k.a 日期),将对象中的每个条目映射到新的 'key'、'value' 对对象,然后按日期 属性 排序。
var dates = { '10/25/2019': 'sth',
'6/21/2017': 'sthelse',
'4/15/2016': 'anotherone',
'12/29/2015': 'wtf',
'8/18/2018': 'lol' };
var sorted = Object.keys(dates)
.map(k => ({ key: new Date(k), value: dates[k] }))
.sort((a,b) => a.key-b.key)
.reduce((cv,pv) => {
cv[pv.key] = pv.value;
return cv;
}, {});
console.log(sorted);
虽然我不太明白为什么对象中的属性顺序会有任何相关性(并且您不应该依赖它),但这应该可行
function sort(o) {
let keys = Object.keys(o)
.sort((a,b) => new Date(a).getTime() - new Date(b).getTime());
let r = {};
for (let k of keys) r[k] = o[k];
return r;
}
如果你喜欢reduce
,你可以在一条语句中完成
function sort(o) {
return Object.keys(o)
.sort((a,b) => new Date(a).getTime() - new Date(b).getTime())
.reduce((a, k) => {
a[k] = o[k];
return a;
}, {});
}
但是恕我直言,该循环更具可读性,并且没有真正看到在此处使用 reduce
的优势...