将具有对象的数组排序到最新日期

时间:2016-10-21 15:39:29

标签: javascript html arrays object

我正在制作聊天应用程序,所有联系人都保存为一个数组中的对象:

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>
它不应该按此顺序显示,但是像这样:ELKE,RUUD,因为最后一条消息被写入Elke

1 个答案:

答案 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

考虑具有多个联系人的情况 - 您需要重新考虑数据结构。所以这里 - 看起来有点复杂!您可以通过扩展messagecontact

的数据结构来测试它

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