-1

There is such an array:

[
    { message: '12949', author: 'esP' },
    { message: '1609', author: 'user' },
    { message: '1613', author: 'adm' },
    { message: '12949', author: 'Mdr' },
    { message: '12949', author: 'rood' }
]

How can you make sure that messages are not repeated, the authors are written separated by commas:

[
    { message: '12949', author: 'esP, Mdr, rood' },
    { message: '1609', author: 'user' },
    { message: '1613', author: 'adm' }
]

I check for uniqueness this way:

const _ = require('underscore');
let a = _.uniq(arr, x => x.message)

What to do next? Create a second loop and compare values?

user17260293
  • 85
  • 10
  • 2
    Does this answer your question? [Most efficient method to groupby on an array of objects](https://stackoverflow.com/questions/14446511/most-efficient-method-to-groupby-on-an-array-of-objects) – pilchard Dec 09 '21 at 11:13
  • or [Group objects by multiple properties in array then sum up their values](https://stackoverflow.com/questions/46794232/group-objects-by-multiple-properties-in-array-then-sum-up-their-values) (concatenation and addition are not that different) – pilchard Dec 09 '21 at 11:14

3 Answers3

0

We can use Array.reduce(), to get the required result.

We'd add each item to a map object (accumulator), using the message value as the key, then use Object.values() to return our desired result array:

const arr = [ { message: '12949', author: 'esP' }, { message: '1609', author: 'user' }, { message: '1613', author: 'adm' }, { message: '12949', author: 'Mdr' }, { message: '12949', author: 'rood' } ];

const result = Object.values(arr.reduce((acc, { message, author }) => { 
    if (!acc[message]) {
        acc[message] = { message, author };
    } else {
        acc[message].author += `, ${author}`;
    }
    return acc;
}, {}));

console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40
0

const data = [
    { message: '12949', author: 'esP' },
    { message: '1609', author: 'user' },
    { message: '1613', author: 'adm' },
    { message: '12949', author: 'Mdr' },
    { message: '12949', author: 'rood' }
]
const result = [];
for (const item of data) {
  const index = result.findIndex(d => d.message === item.message);
  if (index === -1) {
    result.push(item);
  } else {
    result[index].author += `, ${item.author}`;
  }
}
console.log(result);
Nino Filiu
  • 16,660
  • 11
  • 54
  • 84
0

A simple method of having a temporary array and updating it if message is already found. Or concatenting the author otherwise:

var original = [
    { message: '12949', author: 'esP' },
    { message: '1609', author: 'user' },
    { message: '1613', author: 'adm' },
    { message: '12949', author: 'Mdr' },
    { message: '12949', author: 'rood' }
]
var result = [];

for (let data of original) {
  let existingResult = result.find(obj => obj.message == data.message);
  if (existingResult)
    existingResult.author += ", " + data.author;
  else
    result.push(data)
}
console.log(result);
Deepak
  • 2,660
  • 2
  • 8
  • 23