我正在制作聊天应用程序,所有联系人都保存为一个数组中的对象:
var contacts = [{name: "Ruud", age: 20},{name: "Elke", age: 17}];
我正在为对象阵列中保存的每个联系人提供聊天消息:
var message_ruud = [{mes: "Hi", date: 1477064075},{mes: "Ok", date: 1477066075}];
var message_elke = [{mes: "Lol", date: 1477069075},{mes: "Ok", date: 1477063075}];
现在显示联系人shell,按最高(即最新时间)时间戳的联系人排序。怎么做(尽可能快)?
编辑(因为问题不明确):
最后,我希望有一个CONTACTS的输出,它们是最新消息发送的位置,以找出最新消息的位置,如消息数组(如_ruud,_elke)。
var contacts = [{name: "Ruud"},{name: "Elke"}];
var message_elke = [{msg: "Hi",date: 20}];
var message_ruud = [{msg: "Hello",date: 10}];
document.getElementById("contacts").innerHTML = contacts[0].name+"</br>"+contacts[1].name;
<div id="contacts"></div>
答案 0 :(得分:1)
使用Array.prototype.sort
查看下面的演示,将message_ruud
数组从最新到最旧排序 - 您可以对message_elke
执行相同操作:
var message_ruud = [{mes: "Hi", date: 1477064075},{mes: "Ok", date: 1477066099}];
var result = message_ruud.sort(function(a,b){
return (b.date - a.date) || 0;
});
console.log(result);
修改强>:
也许这会指出你正确的方向 - 内联解释:
var contacts = [{name: "Ruud"},{name: "Elke"}];
var message_elke = [{msg: "Hi",date: 20}, {msg: "Hi",date: 30 }];
var message_ruud = [{msg: "Hello",date: 10}, {msg: "Hello",date: 400}];
var result = contacts.sort(function(a, b) {
// find max date for Ruud
var ruud_max = message_ruud.map(function(element) {
return element.date;
}).reduce(function(a, b) {
return Math.max(a, b);
}, 0);
// find max date for Elke
var elke_max = message_elke.map(function(element) {
return element.date;
}).reduce(function(a, b) {
return Math.max(a, b);
}, 0);
// sort the contacts array
return (elke_max - ruud_max) || 0;
});
console.log(result);
编辑2 :
考虑具有多个联系人的情况 - 您需要重新考虑数据结构。所以这里 - 看起来有点复杂!您可以通过扩展message
和contact
:
var contacts = [{
name: "Ruud"
}, {
name: "Elke"
}, {
name: "Alan"
}];
var messages = [{
name: "Ruud",
message: [{
msg: "Hello",
date: 10
}, {
msg: "Hello",
date: 400
}]
}, {
name: "Elke",
message: [{
msg: "Hi",
date: 20
}, {
msg: "Hi",
date: 30
}]
}, {
name: "Alan",
message: [{
msg: "Hi there",
date: 20
}, {
msg: "Lol",
date: 40
}]
}];
var result = contacts.sort(function(x, y) {
var max_date_x = messages.find(function(element){
return element.name === x.name;
}).message.map(function(element) {
return element.date;
}).reduce(function(a, b) {
return Math.max(a, b);
}, 0);
var max_date_y = messages.find(function(element){
return element.name === y.name;
}).message.map(function(element) {
return element.date;
}).reduce(function(a, b) {
return Math.max(a, b);
}, 0);
// sort the contacts array
return (max_date_y - max_date_x) || 0;
});
console.log(result);