Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript按顺序排序数组_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript按顺序排序数组

Javascript按顺序排序数组,javascript,arrays,sorting,Javascript,Arrays,Sorting,嗨,我正在开发一个聊天应用程序,我想对新消息进行排序,并根据时间保持历史顺序 例如,我有一个这样的数组中的聊天信息,现在我使用“时间”键对每个信息对象进行排序 [{"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":"

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

例如,我有一个这样的数组中的聊天信息,现在我使用“时间”键对每个信息对象进行排序

[{"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}]
如何使用“read”键对它们进行排序,其中所有的假值都应位于顶部,而其余的对象应使用“time”键进行排序

比如像这样

[{"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 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}];
数据排序((a,b)=>{
如果(a.read==b.read){
返回a.time-b.time;
}
返回a.read?1:-1;
});
forEach(x=>console.log(JSON.stringify(x))
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}];
数据排序((a,b)=>{
如果(a.read==b.read){
返回a.time-b.time;
}
返回a.read?1:-1;
});
forEach(x=>console.log(JSON.stringify(x))您可以使用和回调排序顺序,并链接所需的排序参数

此回调使用布尔值到数字的隐式转换进行计算

var数组=[{“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;
array.sort(函数(a,b){
返回a.read-b.read | a.time-b.time;
});
console.log(数组)
.as控制台包装{max height:100%!important;top:0;}
您可以使用和回调排序顺序,并链接所需的排序参数

此回调使用布尔值到数字的隐式转换进行计算

var数组=[{“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;
array.sort(函数(a,b){
返回a.read-b.read | a.time-b.time;
});
console.log(数组)

。作为控制台包装{max height:100%!important;top: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);

您还可以创建一个用于红色消息的数组,另一个用于未红色消息的数组。由于消息已按时间排序,因此更是如此:

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

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

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

PS:下划线js()提供了一个sortBy函数,它声称该函数是稳定的


PPS:如果你想用一个排序来精确地完成这项工作,请使用两个键的组合
compare\u key\u generator=function(o){return o.read.toString()+o.time}

如果可能的话,我建议分别对
“read”:false
read:true
值进行排序

否则,您只需使用稳定的排序算法对数组进行两次排序(如合并排序)。首先按“时间”键,然后按“读取”键

PS:下划线js()提供了一个sortBy函数,它声称该函数是稳定的


PPS:如果你想用一个排序来完成这项工作,请使用两个键的组合
compare\u key\u generator=function(o){return o.read.toString()+o.time}

现在如何排序?我首先将数组拆分为一个有读取消息的数组和一个没有读取消息的数组,然后分别对它们进行排序。这样,您仍然可以使用成品分拣机。或者您正在寻找特定的代码?您现在如何排序?我将首先将数组拆分为一个包含已读消息的数组和一个包含未读消息的数组,然后分别对它们进行排序。这样,您仍然可以使用成品分拣机。或者你是在寻找特定的代码?嘿,我想你是在用另一种方法,假值需要转到topSuper-neat!我会说这是一条单行线,我想你是在用另一种方式,错误的值需要去超级净!我认为这是一条单行线