【问题标题】:How to sort object array by time in javascript如何在javascript中按时间对对象数组进行排序
【发布时间】:2017-01-16 09:57:40
【问题描述】:

我有一个看起来像这样的对象数组:

  • [0] = { 运输号码:'45',时间:'10:28:00',日期:“2017-01-16”}
  • [1] = { 运输号码:'45',时间:'10:38:00',日期:“2017-01-16”}
  • [2] = { 运输号码:'45',时间:'10:48:00',日期:“2017-01-16”}
  • [3] = {运输号码:'14',时间:'10:12:00',日期:“2017-01-16”}
  • [4] = {运输号码:'14',时间:'10:24:00',日期:“2017-01-16”}
  • [5] = {运输号码:'14',时间:'10:52:00',日期:“2017-01-16”}

对象数组总是看起来像这样未排序。首先按运输号码,然后按时间。这是由于我正在使用的 api。

我的问题是:我怎样才能只按时间排序这个数组?

我尝试在存储对象数组的变量上使用如下所示的排序函数,但没有成功:

allBuses.sort(function(a,b){
var c = a.time;
var d = b.time;

if(c > d){
return d
}

else return c

【问题讨论】:

  • 您误用了sort()。你读过its documentation吗?
  • 将整个if 语句更改为return c > d ? 1 : -1

标签: javascript arrays api sorting time


【解决方案1】:

您可以将time 视为字符串并使用String#localeCompare 进行排序。

var data = [{ transportnumber: '45', time: '10:28:00', date:"2017-01-16"}, { transportnumber: '45', time: '10:38:00', date:"2017-01-16" },{ transportnumber: '45', time: '10:48:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:12:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:24:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:52:00', date:"2017-01-16"}];

data.sort(function (a, b) {
    return a.time.localeCompare(b.time);
});

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    您可以使用Array.prototype.sort()比较超时:

    const allBuses = [{ transportnumber: '45', time: '10:28:00', date:"2017-01-16"}, { transportnumber: '45', time: '10:38:00', date:"2017-01-16" },{ transportnumber: '45', time: '10:48:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:12:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:24:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:52:00', date:"2017-01-16"}]
    
    const getNumber = t => +t.replace(/:/g, '')
    allBuses.sort(({ time: a }, { time: b }) => getNumber(a) - getNumber(b))
    
    console.log(allBuses)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    另外,您可以使用Array.prototype.sort() 比较时间字符串:

    const allBuses = [{ transportnumber: '45', time: '10:28:00', date:"2017-01-16"}, { transportnumber: '45', time: '10:38:00', date:"2017-01-16" },{ transportnumber: '45', time: '10:48:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:12:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:24:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:52:00', date:"2017-01-16"}]
    
    allBuses.sort(({ time: a }, {time: b }) => a > b ? 1 : a < b ? -1 : 0)
    
    console.log(allBuses)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      您返回的是 cd,它们是时间值。您的函数需要返回...

      • 如果值相同则为 0
      • 如果 b 低于 a 则为正 (>0)(例如 1)
      • 负数 (a 如果低于 b(例如 -1)

      【讨论】:

        【解决方案4】:

        var array = [ { transportnumber: '45', time: '10:28:00', date:"2017-01-16"}
        ,{ transportnumber: '45', time: '10:38:00', date:"2017-01-16"}
        ,{ transportnumber: '45', time: '10:48:00', date:"2017-01-16"}
        ,{ transportnumber: '14', time: '10:12:00', date:"2017-01-16"}
        ,{ transportnumber: '14', time: '10:24:00', date:"2017-01-16"}
        ,{ transportnumber: '14', time: '10:52:00', date:"2017-01-16"}];
        array.sort(function(a,b){
          return new Date(b.date + " "+b.time) - new Date(a.date + " "+a.time);
        });
        console.log(array);

        你可以结合日期和时间并像这样排序

        【讨论】:

          【解决方案5】:
              var data = [{ transportnumber: '45', time: '10:28:00', date:"2017-01-16"}, { transportnumber: '45', time: '10:38:00', date:"2017-01-16" },{ transportnumber: '45', time: '10:48:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:12:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:24:00', date:"2017-01-16" }, { transportnumber: '14', time: '10:52:00', date:"2017-01-16"}];
          
          data.sort(function(a,b){
          
          return b.time>a.time; 
          
          
          })
          console.log(data)
          

          【讨论】:

          • 检查 Array.prototype.sort() 函数是否可以在比较数字时简单地从 a 中减去 b。但在这种情况下,您是在比较字符串
          • 这将无法正常工作。比较函数应该返回一个小于零、零或大于零的值。这只会返回真或假,实际上是 1 或 0(因此没有负数)。
          【解决方案6】:

          如果您还想添加日期

          data = []
          data[0] = { transportnumber: '45', time: '10:28:00', date:"2017-01-16"}
          data[1] = { transportnumber: '45', time: '10:38:00', date:"2017-01-16"}
          data[2] = { transportnumber: '45', time: '10:48:00', date:"2017-01-16"}
          data[3] = { transportnumber: '14', time: '10:12:00', date:"2017-01-16"}
          data[4] = { transportnumber: '14', time: '10:24:00', date:"2017-01-16"}
          data[5] = { transportnumber: '14', time: '10:52:00', date:"2017-01-16"}
          
          data.sort((a, b) => {
              if (a.date < b.date)
                  return -1
          
              if (a.date > b.date)
                  return 1
          
              if (a.date == b.date) {
                  if (a.time < b.time)
                      return -1
          
                  if (a.time > b.time)
                      return 1
          
                  return 0
              }
          });
          

          【讨论】:

            【解决方案7】:

            试试这个

                allBuses.sort(function(a,b){
                var c = new Date(a.date + ":"+ a.time).getTime();
                var d = new Date(b.date + ":"+b.time).getTime();
                console.log(c,d);
                return c -d;
                });
            

            【讨论】:

            • 这将创建一个类似于 "2017-01-16:10:28:00" 的字符串,该字符串与 ECMA-262 支持的格式不一致,并且在大多数实现中很可能无法正确解析(例如 Safari 和 Firefox)。加入“T”会更好,但这也有点问题。
            【解决方案8】:

            如果你的应用程序有lodash,你可以很容易地做到这一点。

            var sorted = _.orderBy(data,function(item){
            return new Date(item.date + " " + data.time);
            });
            

            【讨论】:

              猜你喜欢
              • 2010-11-28
              • 2019-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-12-23
              • 2011-09-06
              相关资源
              最近更新 更多