未按正确顺序排序的对象数组

时间:2017-11-08 15:27:01

标签: javascript arrays sorting typescript lodash

我有一个对象数组,我正在尝试通过对象上的日期属性对数组进行排序。我正在使用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>

但由于某种原因,订单并不总是正确的,所以在我的排序数组上我会有这个。

  1. 2016/2/24 5:08
  2. 3/14/2012 8:39 AM
  3. 3/23/2016 1:56 AM
  4. 5/9/216 8:14 AM
  5. 5/10/2016 9:23 PM
  6. 6/7/2011 9:20 AM
  7. 关于如何解决这个问题的任何想法,以便正确排序?

3 个答案:

答案 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表示降序排序。

见这里:https://jsfiddle.net/robbiemilejczak/kcuq6td5/

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