我正在尝试选择收件箱中的最后一封邮件,并按topic_id将它们分组在列表中。我想显示每个主题的最后一条消息。

数组如下所示:

[{
"id":"5",
"topic_id":"4",
"message_from":"24",
"message":"how do you do?",
"date":"2015-01-13 15:34:59"
},
{
"id":"6",
"topic_id":"1",
"message_from":"33",
"message":"go go go!!",
"date":"2015-01-13 13:35:06"
},
{
"id":"7",
"topic_id":"4",
"message_from":"33",
"message":"Je suis charlie",
"date":"2015-01-14 16:24:46"
},....


有没有解决方案可以做到无循环?

最佳答案

没有循环就无法做到这一点,但是可以通过将事件序列分解为较小的函数来使此过程变得更容易。您可能不喜欢这种方法,但这是最干净的imo。或者,您可以使用第三方库(可能是下划线?),该库允许您对数据进行分组。

基本上,获取所有记录的所有topic_id的列表,循环遍历topic_id数组,并为每个记录提取最后一条记录,然后将其添加到输出数组中。

// Get a list of all the topic ids - no duplicates
function getTopicIds(arr) {
  var out = [];
  arr.forEach(function (el) {
    if (out.indexOf(el.topic_id) === -1) out.push(el.topic_id);
  });
  return out;
}

// Given a topic_id, filter the array for only those records
// sort in desc order by id, and return the first record.
// Given that each record has a unique id, and we know that older
// messages will have higher ids, it's easier to sort by id than
// date here
function getLastMsg(id, arr) {
  return arr.filter(function (el) {
    return el.topic_id === id;
  }).sort(function (a, b) { return +b.id - +a.id; })[0];
}

// return a array of the last messages for each topic_id
// in the records array
function getLastMsgs(arr) {
  return getTopicIds(arr).map(function (id) {
    return getLastMsg(id, arr);
  });
}

var result = getLastMsgs(arr);


DEMO

关于javascript - Json和按解决方案分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27940750/

10-16 17:51