-2

I've got the following data - array of objects Its a sender ID and a message

[
    {
        "sender": "1000000000",
        "message": message 1"
    }, 
    {
        "sender": "1000000000",
        "message": "message 2"
    },
    {
        "sender": "1000000001",
        "message": "message 3"
    }, 
    {
        "sender": "1000000002",
        "message": "message 4"
    },
    {
        "sender": "1000000002",
        "message": "message 5"
    }, 
    {
        "sender": "1000000002",
        "message": "message 6"
    }
]

I want to create a new array of objects that is structured like below. So the messages are grouped by the sender. It will help with displaying the data.

[
    {
        "sender": "1000000000",
        "messages": [
              "message 1",
              "message 2",
         ]
    },
    {
        "sender": "1000000001",
        "messages": [
              "messages 3"
        ]
    }, 
    {
        "sender": "1000000002",
        "messages": [
              "message 4",
              "message 5",
              "message 6"
        ]
    }
]

I've been playing with .map() and .filter() - but I'm a long way off.

I've also tried for loops etc which I might be able to get working but they are ugly.

Is there an easy what to change the structure?

thankyou!

Adam
  • 19,932
  • 36
  • 124
  • 207
  • 17,3k rep and yet... What have you tried so far to solve this on your own? Add the most promising approach, explain the problems you have with that, preferable with a snippet -> [How do I ask a good question?](https://stackoverflow.com/help/how-to-ask) – Andreas Aug 18 '21 at 11:19
  • There are a bunch of questions on how to group an array of objects: [How much research effort is expected of Stack Overflow users?](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users) – Andreas Aug 18 '21 at 11:20

1 Answers1

2

You can use Array.reduce() to group your messages by sender:

const data = [ { "sender": "1000000000", "message": "message 1" }, { "sender": "1000000000", "message": "message 2" }, { "sender": "1000000001", "message": "message 3" }, { "sender": "1000000002", "message": "message 4" }, { "sender": "1000000002", "message": "message 5" }, { "sender": "1000000002", "message": "message 6" } ] 
const result = Object.values(data.reduce((acc, cur) => { 
    acc[cur.sender] = acc[cur.sender] || { sender: cur.sender, messages: []};
    acc[cur.sender].messages.push(cur.message);
    return acc;
}, {}));

console.log("Result:", result);
        
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40