您正在处理聊天应用程序,我想对新邮件进行排序,并根据时间保留历史记录顺序。
例如,我在这样的数组中有聊天消息,现在正在使用每个消息对象上的“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}]
答案 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}