按顺序排列Javascript排序数组

时间:2016-10-15 15:22:52

标签: javascript arrays sorting

您正在处理聊天应用程序,我想对新邮件进行排序,并根据时间保留历史记录顺序。

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

[{"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}]

4 个答案:

答案 0 :(得分:5)

您可以对排序顺序使用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; }

答案 1 :(得分:0)

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)));

答案 2 :(得分:0)

你也可以创建一个用于红色消息的数组,用另一个用于未知消息。因为消息已按时间排序,所以更是如此:

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);

答案 3 :(得分:0)

如果可能,我建议您分别对"read":false"read:true值进行排序。

否则,您只需使用稳定排序算法(如合并排序)对数组进行两次排序。首先是时间'密钥,然后通过“阅读”#39;键。

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

PPS:如果您想完全按一种方式执行此操作,请使用两个键的组合compare_key_generator = function(o){return o.read.toString()+o.time}