Javascript 如何获取集合中每个发件人的最新邮件?

Javascript 如何获取集合中每个发件人的最新邮件?,javascript,arrays,filter,reduce,Javascript,Arrays,Filter,Reduce,我有这样一个对象数组: const messages = [ {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"}, {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12

我有这样一个对象数组:

const messages = [ 
  {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"},
  {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:45"},
  {message: "good afternoon", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:41"},
  {message: "hfdsghfdfhjo", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:38"},
  {message: "hhhhhhhhhhhhh ", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "11:50"}
];
const messages = [
  {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"},
  {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:45"}
];
我想获取每个发件人的最新消息,如下所示:

const messages = [ 
  {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"},
  {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:45"},
  {message: "good afternoon", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:41"},
  {message: "hfdsghfdfhjo", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:38"},
  {message: "hhhhhhhhhhhhh ", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "11:50"}
];
const messages = [
  {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"},
  {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:45"}
];

如何做到这一点?

为此,您可以使用array.reduce,例如:

const messages=[{message:“ghhhhhhhh”,receiver:“ox0prehxxxutq1xnontsx7moigp2”,sender:“14”,time:“12:56”}
,{消息:“ggggggg hjgcgh”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:45”}
,{信息:“下午好”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:41”}
,{信息:“hfdsghfdfhjo”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:38”}
,{信息:“hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh;
函数解析时间(timeStr){
const fields=timeStr.split(“:”).map(parseInt);
返回字段[0]*60+字段[1];
}
让结果=消息。减少((映射,项)=>{
如果(!map[item.sender]|parseTime(map[item.sender.time)log(“最新消息:”,Object.values(结果))为此,您可以使用array.reduce,例如:

const messages=[{message:“ghhhhhhhh”,receiver:“ox0prehxxxutq1xnontsx7moigp2”,sender:“14”,time:“12:56”}
,{消息:“ggggggg hjgcgh”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:45”}
,{信息:“下午好”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:41”}
,{信息:“hfdsghfdfhjo”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:38”}
,{信息:“hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh;
函数解析时间(timeStr){
const fields=timeStr.split(“:”).map(parseInt);
返回字段[0]*60+字段[1];
}
让结果=消息。减少((映射,项)=>{
如果(!map[item.sender]|parseTime(map[item.sender.time)log(“最新消息:”,Object.values(结果))您可以这样做:-

const messages = [ {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"}
, {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:45"}
, {message: "good afternoon", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:41"}
, {message: "hfdsghfdfhjo", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:38"}
, {message: "hhhhhhhhhhhhh ", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "11:50"}]

const getUniqueMessages = (messages) => {
    const msgMap = {};
    const uniqueMsg = [];
    messages.forEach(item => {
        if(!msgMap[item.sender]) {
            msgMap[item.sender] = true;
            uniqueMsg.push(item)
        }
    });

   return uniqueMsg;   
}

// console.log(getUniqueMessages(messages));

您可以这样做:-

const messages = [ {message: "ghhhhhhhh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "12:56"}
, {message: "ggggggghjjgcgh", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:45"}
, {message: "good afternoon", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:41"}
, {message: "hfdsghfdfhjo", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "ZCiuWczin3VuibH59MISuEqR3pc2", time: "12:38"}
, {message: "hhhhhhhhhhhhh ", receiver: "OX0pReHXfXUTq1XnOnTSX7moiGp2", sender: "14", time: "11:50"}]

const getUniqueMessages = (messages) => {
    const msgMap = {};
    const uniqueMsg = [];
    messages.forEach(item => {
        if(!msgMap[item.sender]) {
            msgMap[item.sender] = true;
            uniqueMsg.push(item)
        }
    });

   return uniqueMsg;   
}

// console.log(getUniqueMessages(messages));
一种快速(O(n))且可读性强的方法 实际上,这是一个很好的问题。我觉得我可以提供一个比以前的答案更有效的答案(如果您要反复运行此操作,这一点很重要),同时也非常清楚地阅读和理解

基本上,您有一个集合,并希望减少按特定属性对其进行分组的对象

案例1:集合已排序 如果我们可以假设集合首先按最新消息排序(看起来是这样),那么我们可以保留看到的第一条消息:

const messages=[
{消息:“ghhhhhhh”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“14”,时间:“12:56”},
{消息:“ggggggg hjgcgh”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:45”},
{信息:“下午好”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:41”},
{消息:“hfdsghfdfhjo”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:38”},
{消息:“hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
];
/**@type{Map}*/
const latestMessageBySender=new Map();
//保留来自每个唯一发件人的最新邮件
for(const message of messages){
如果(!latestMessageBySender.has(message.sender)){
latestMessageBySender.set(message.sender,message);
}
}
//收集并显示结果消息
for(latestMessageBySender.values()的常量消息){
控制台信息(消息);
}
一种快速(O(n))且可读性强的方法 实际上,这是一个很好的问题。我觉得我可以提供一个比以前的答案更有效的答案(如果您要反复运行此操作,这一点很重要),同时也非常清楚地阅读和理解

基本上,您有一个集合,并希望减少按特定属性对其进行分组的对象

案例1:集合已排序 如果我们可以假设集合首先按最新消息排序(看起来是这样),那么我们可以保留看到的第一条消息:

const messages=[
{消息:“ghhhhhhh”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“14”,时间:“12:56”},
{消息:“ggggggg hjgcgh”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:45”},
{信息:“下午好”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:41”},
{消息:“hfdsghfdfhjo”,接收者:“OX0pReHXfXUTq1XnOnTSX7moiGp2”,发送者:“ZCiuWczin3VuibH59MISuEqR3pc2”,时间:“12:38”},
{消息:“hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
];
/**@type{Map}*/
const latestMessageBySender=new Map();
//保留来自每个唯一发件人的最新邮件
for(const message of messages){
如果(!latestMessageBySender.has(message.sender)){
latestMessageBySender.set(message.sender,message);
}
}
//收集并显示结果消息
for(latestMessageBySender.values()的常量消息){
控制台信息(消息);
}