我有一个对象数组,我正在尝试通过对象上的日期属性对数组进行排序。我正在使用lodash函数orderBy,所以我可以传递升序或降序。
var searchObj = [{id: 1, postDate: '2/24/2016 5:08 PM'},
{id: 2, postDate: '3/14/2012 8:39 AM'},
{id: 3, postDate: '3/23/2016 1:56 AM'},
{id: 4, postDate: '5/9/2016 8:14 AM'},
{id: 5, postDate: '11/11/2016 05:26 PM'},
{id: 6, postDate: '05/19/2016 03:40 AM'},
{id: 7, postDate: '5/10/2016 9:23 PM'},
{id: 8, postDate: '11/07/2017 01:07 PM'},
{id: 9, postDate: '6/7/2011 9:20 AM'},
{id: 10, postDate: '11/03/2015 12:03 PM'}];
console.log(searchObj);
searchObj = _.orderBy(searchObj, [obj =>
new Date(obj['postDate'].trim()).getTime() / 10000
], ['asc']);
console.log(searchObj);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
但由于某种原因,订单并不总是正确的,所以在我的排序数组上我会有这个。
关于如何解决这个问题的任何想法,以便正确排序?
答案 0 :(得分:2)
问题是,您的字符串格式不是new Date
required to parse,并且实施将依赖"...any implementation-specific heuristics or implementation-specific date formats..." - 可能会对其应用不同的解释你给它的不同字符串,即使你知道它们都是相同的格式。
您需要自己解析字符串,并使用new Date(year, month, day, hour, minute, sec, ms)
构造函数。 (我不是在这里写的;它是微不足道的,并且有很多关于SO的例子。)
答案 1 :(得分:0)
为什么要用lodash?你不需要它。
function sortBy(list, columnName, descending){
let res = list.sort(function(a, b){
return a[columnName].getTime() - b[columnName].getTime();
});
if(descending){
return res.reverse();
} else {
return res;
}
}
其中descending是布尔值,true表示升序,false表示降序排序。
答案 2 :(得分:0)
你几乎得到它,只需从_.orderBy中的第二个参数中删除[]。
var searchObj = [{id: 1, postDate: '2/24/2016 5:08 PM'},
{id: 2, postDate: '3/14/2012 8:39 AM'},
{id: 3, postDate: '3/23/2016 1:56 AM'},
{id: 4, postDate: '5/9/2016 8:14 AM'},
{id: 5, postDate: '11/11/2016 05:26 PM'},
{id: 6, postDate: '05/19/2016 03:40 AM'},
{id: 7, postDate: '5/10/2016 9:23 PM'},
{id: 8, postDate: '11/07/2017 01:07 PM'},
{id: 9, postDate: '6/7/2011 9:20 AM'},
{id: 10, postDate: '11/03/2015 12:03 PM'}];
console.log(searchObj);
searchObj = _.orderBy(searchObj, obj =>
new Date(obj['postDate'].trim()).getTime() / 10000
, 'asc');
console.log(searchObj);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>