JavaScript:数组操作

JavaScript:数组操作,javascript,arrays,Javascript,Arrays,我使用react js开发聊天应用程序 这是我的对象数组 const messages = [ {message: "ghhhhhhhh", receiver: "faty", sender: "harry", time: "10/1/2019 12:56"}, {message: "ggggggghjjgcgh", receiver: "harry", sender: "marie", time: " 10/1/2019 12:45"}, {message: "good afte

我使用react js开发聊天应用程序 这是我的对象数组

const messages = [ 
  {message: "ghhhhhhhh", receiver: "faty", sender: "harry", time: "10/1/2019 12:56"},
  {message: "ggggggghjjgcgh", receiver: "harry", sender: "marie", time: " 10/1/2019 12:45"},
  {message: "good afternoon", receiver: "harry", sender: "marie", time: " 10/1/2019 12:41"},
  {message: "hfdsghfdfhjo", receiver: "faty", sender: "harry", time: " 10/1/2019 12:38"},
  {message: "hhhhhhhhhhhhh ", receiver: "harry", sender: "faty", time: " 10/1/2019 11:50"}
];
我想显示每个人之间的最后一条消息

我尝试下面的代码,但他没有呈现我想要的

    const senders =messages.reduce((a, c) => {
      a[c.sender] = a[c.sender] || { data: [] };
      a[c.sender].data.push({ sender: c.sender, message: c.message, time: c.time, receiver: c.receiver, hotel_id: c.hotel_id, isseen: c.isseen });
      a[c.sender].data.sort((a, b) =>{console.log(new Date(b.time),'aaaaaaaaaaaaaa');return ( new Date(b.time).getTime() - new Date(a.time).getTime())})
      return a;
    }, {})
    var messageInbox = Object.values(senders).map(s => s.data[0])
    console.log("Latest messages:", messageInbox);

这是我想要显示的内容:

  {message: "ghhhhhhhh", receiver: "faty", sender: "harry", time: "10/1/2019 12:56"},
  {message: "ggggggghjjgcgh", receiver: "harry", sender: "marie", time: " 10/1/2019 12:45"}
让我解释一下我有两个人faty和harry他们之间有很多信息我想展示他们之间的最后一条信息harry和marie之间的信息


如果您理解我的问题,请帮助我,谢谢

按日期对元素进行排序,然后根据您想要的接收者或发送者进行筛选,并按
长度-1
索引选择最后一个:

  const lastMessage =
  messages[
    messages
      .sort((a, b) => {
        new Date(a.time) - new Date(b.time);
      })
      .filter(el => el.sender === "faty" && el.receiver === "harry").length - 1
  ];
在行动中看到它:

const messages=[
{信息:“ghhhhhh”,接收者:“faty”,发送者:“harry”,时间:“2019年10月1日12:56”},
{信息:“gggggggghjgcgh”,接收者:“哈里”,发送者:“玛丽”,时间:“2019年1月10日12:45”},
{信息:“下午好”,接收者:“哈里”,发送者:“玛丽”,时间:“2019年10月1日12:41”},
{信息:“hfdsghfdfhjo”,接收者:“faty”,发送者:“harry”,时间:“2019年1月10日12:38”},
{信息:“hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
];
const lastMessage=
信息[
信息
.排序((a,b)=>{
新日期(a时间)-新日期(b时间);
})
.filter(el=>el.sender==“faty”&&el.receiver==“harry”)。长度-1
];

console.log(lastMessage)
您的目标可以通过简单的操作实现:

  • 您可以使用
    reduce
    方法按多个键分组,例如
    receiver
    sender
  • 数据分组后,您可以按
    time
    属性对
    消息进行
    排序。代码如下所示
    s.messages.sort((a,b)=>newdate(b.time)-newdate(a.time))
  • 然后您应该只获得
    消息数组的第一项。代码如下所示:
    …s.messages.sort((a,b)=>新日期(b.time)-新日期(a.time))[0]| |“”
因此,整个代码可能如下所示:

let result = [...messages.reduce((r, o) => {    
  const key = o.receiver + '-' + o.sender;    
  const item = r.get(key) || Object.assign({}, o, {
    messages: []
  });    
  item.messages.push({message: o.message, time: o.time});    
  return r.set(key, item);
}, new Map).values()];

result = result.map( s=> ({receiver: s.receiver, sender: s.sender, 
    ...s.messages.sort((a, b) => new Date(b.time) - new Date(a.time))[0] || '' }))
例如:

const messages=[
{信息:“ghhhhhh”,接收者:“faty”,发送者:“harry”,时间:“2019年10月1日12:56”},
{信息:“gggggggghjgcgh”,接收者:“哈里”,发送者:“玛丽”,时间:“2019年1月10日12:45”},
{信息:“下午好”,接收者:“哈里”,发送者:“玛丽”,时间:“2019年10月1日12:41”},
{信息:“hfdsghfdfhjo”,接收者:“faty”,发送者:“harry”,时间:“2019年1月10日12:38”},
{信息:“hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
];
let result=[…messages.reduce((r,o)=>{
const key=o.receiver+'-'+o.sender;
const item=r.get(key)| | Object.assign({},o{
信息:[]
});
item.messages.push({message:o.message,time:o.time});
返回r.set(键、项);
},新映射)。值();
result=result.map(s=>({receiver:s.receiver,sender:s.sender,
…s.messages.sort((a,b)=>新日期(b.time)-新日期(a.time))[0]| |“'}))

控制台日志(结果)您可以使用下面的代码

 const messages = [
                {message: "ghhhhhhhh", receiver: "faty", sender: "harry", time: "10/1/2019 12:56"},
                {message: "ggggggghjjgcgh", receiver: "harry", sender: "marie", time: " 10/1/2019 12:45"},
                {message: "good afternoon", receiver: "harry", sender: "marie", time: " 10/1/2019 12:41"},
                {message: "hfdsghfdfhjo", receiver: "faty", sender: "harry", time: " 10/1/2019 12:38"},
                {message: "hhhhhhhhhhhhh ", receiver: "harry", sender: "faty", time: " 10/1/2019 11:50"}
            ];

            function groupBy(objectArray, property) {
                return objectArray.reduce(function (acc, obj) {
                    var key = obj[property];
                    if (!acc[key]) {
                        acc[key] = [];
                    }
                    acc[key].push(obj);
                    return acc;
                }, {});
            }
            var messages1 = groupBy(messages, 'receiver');
            console.log(messages1); // get it in array with key as (harray or marie)
            var message2 = [];
            for(var k in messages1) {
                message2.push(messages1[k][0]); (// push them in simple array)
            }

如果您需要每对夫妇的最新消息,这里有一个函数可以检查这一点。你把最新的法蒂传给哈利,哈利传给法蒂,哈利传给玛丽

 const getLatest = (messages) => {
  const hash = {};
  // Turns data into objects like this, to store which is latest:
  // {
  //   key: {
  //     time: timestamp,
  //     message: {}
  //   },
  // }

  for (let message of messages) {
    let sender = message.sender;
    let receiver = message.receiver;
    let time = message.time;

    let record = hash[`${sender}${receiver}`];
    if (record === undefined || new Date(record.time) > new Date(time)) {
      hash[`${sender}${receiver}`] = {};
      hash[`${sender}${receiver}`].time = time;
      hash[`${sender}${receiver}`].message = message;
    }
  }

  return Object.keys(hash).map(key => hash[key].message);
}

如果您不关心一对接收者是发送者还是接收者(因此Hary可能是接收者/发送者,Faty也可能是接收者/发送者)——并且根据预期的输出,您似乎不关心——那么下面的代码应该可以工作。首先,我按相反的时间顺序对消息进行排序,因为在使用reduce进行迭代时,第一个唯一的收件人组合将是它们之间的最后一条消息

然后,通过将接收者对添加到数组中,对该数组进行排序,并对其进行JSON字符串化,为接收者对生成唯一键,而不管它们是接收者还是发送者。排序使您能够在收件人之间获得最后一封邮件,而不管谁是收件人,谁是发件人——如果您希望Hary和Faty有两个条目,一个条目对应收件人还是发件人,那么请删除排序

如果我在每次reduce迭代中返回的对象还没有该键,我将使用该键添加消息;如果它确实有那个条目,我会跳过它,因为我们已经有了那个特定收件人对的最后一条消息。最后,我对reduce返回的对象调用Object.values

代码也位于以下位置:

输出:

[ { message: 'ghhhhhhhh',
    receiver: 'faty',
    sender: 'harry',
    time: '10/1/2019 12:56' },
  { message: 'ggggggghjjgcgh',
    receiver: 'harry',
    sender: 'marie',
    time: ' 10/1/2019 12:45' } ]

请提供预期输出。@BelminBedakok@BelminBedak我有解释请检查问题听起来你有三个人,包括“玛丽”@Dexygen是的我想显示哈里和法蒂之间的消息/哈里和玛丽之间的消息谢谢你的回答但你还不明白我的问题不是我的投票,但我猜这是因为:1。答案不会产生要求的结果,2。你什么都不解释。你只需要提供一个片段就可以了。3.这既不好也不是自我解释的代码;最明显的是,对于一些刚读到这篇文章的新手来说,这简直是胡言乱语。单字符变量名可能在你涂鸦的时候很快就可以使用,但如果你或其他人应该回来阅读这段代码的话就不行了。“也许正是这些原因导致了投票的失败。”托马斯谢谢你的评论。我已经编辑了我的答案。在我看来,它变得越来越清晰和更好。
[ { message: 'ghhhhhhhh',
    receiver: 'faty',
    sender: 'harry',
    time: '10/1/2019 12:56' },
  { message: 'ggggggghjjgcgh',
    receiver: 'harry',
    sender: 'marie',
    time: ' 10/1/2019 12:45' } ]