我正在尝试选择收件箱中的最后一封邮件,并按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/