【问题标题】:Javascript sort array in orderJavascript按顺序排序数组
【发布时间】:2016-10-15 15:22:51
【问题描述】:

您好,我正在开发一个聊天应用程序,我想根据时间对新消息进行排序并保持历史顺序。

例如,我将聊天消息放在这样的数组中,现在使用每个消息对象上的“时间”键对它们进行排序!

[{"user":"a", "msg":"Hi ", "read":true, "time":1}
{"user":"b", "msg":"Hi ", "read":false, "time":2}
{"user":"c", "msg":"Hi ", "read":false, "time":3}
{"user":"d", "msg":"Hi ", "read":true, "time":4}
{"user":"e", "msg":"Hi ", "read":true, "time":5}]

我如何也可以使用“读取”键对它们进行排序,其中所有错误值都应位于顶部,但其余对象应使用“时间”键进行排序。

比如这样

[{"user":"b", "msg":"Hi ", "read":false, "time":2}
{"user":"c", "msg":"Hi ", "read":false, "time":3}
{"user":"a", "msg":"Hi ", "read":true, "time":1}
{"user":"d", "msg":"Hi ", "read":true, "time":4}
{"user":"e", "msg":"Hi ", "read":true, "time":5}]

【问题讨论】:

  • 你现在排序如何?
  • 我首先将数组拆分为一个包含已读消息和一个未读消息,然后对它们进行独立排序。这样您仍然可以使用完成的分拣机。还是你在找具体的代码?

标签: javascript arrays sorting


【解决方案1】:

您可以使用Array#sort 和排序顺序的回调并链接所需的排序参数。

此回调通过计算将布尔值隐式转换为数字。

var array = [{ "user": "a", "msg": "Hi ", "read": true, "time": 1 }, { "user": "b", "msg": "Hi ", "read": false, "time": 2 }, { "user": "c", "msg": "Hi ", "read": false, "time": 3 }, { "user": "d", "msg": "Hi ", "read": true, "time": 4 }, { "user": "e", "msg": "Hi ", "read": true, "time": 5 }];

array.sort(function (a, b) {
    return a.read - b.read || a.time - b.time;
});

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

【讨论】:

  • 嘿,我认为你是反过来做的,错误的值需要放在顶部
  • 超级整洁!我会说这是一个班轮
【解决方案2】:

var data = [{"user":"a", "msg":"Hi ", "read":true, "time":1},
{"user":"b", "msg":"Hi ", "read":false, "time":2},
{"user":"c", "msg":"Hi ", "read":false, "time":3},
{"user":"d", "msg":"Hi ", "read":true, "time":4},
{"user":"e", "msg":"Hi ", "read":true, "time":5}];

data.sort((a, b) => {
  if (a.read === b.read) {
    return a.time - b.time;
  }
  return a.read ? 1 : -1;
});

data.forEach(x => console.log(JSON.stringify(x)));

【讨论】:

    【解决方案3】:

    您还可以为红色消息创建一个数组,为非红色消息创建另一个数组。更是如此,因为消息已经按时间排序:

    var chat = [{"user":"b", "msg":"Hi ", "read":false, "time":2}, {"user":"c", "msg":"Hi ", "read":false, "time":3}, {"user":"a", "msg":"Hi ", "read":true, "time":1}, {"user":"d", "msg":"Hi ", "read":true, "time":4}, {"user":"e", "msg":"Hi ", "read":true, "time":5}];
    
    var chatRed = chat.filter(x => x.read);
    var chatNotRed = chat.filter(x => !x.read);
    
    console.log(chatNotRed);
    console.log(chatRed);
    

    【讨论】:

      【解决方案4】:

      如果可能,我建议将"read":false"read:true 值分开排序。

      否则,您可以使用稳定排序算法(如归并排序)简单地对数组进行两次排序。首先按“时间”键,然后按“读取”键。

      PS:Underscore js (https://github.com/jashkenas/underscore) 提供了一个它声称是稳定的 sortBy 函数。

      PPS:如果您想完全使用一种排序,请使用两个键的组合 compare_key_generator = function(o){return o.read.toString()+o.time}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        相关资源
        最近更新 更多