loki9
loki9

Reputation: 625

Reordering array objects via javascript

I have been doing some sorting and still dont get it why the result is []. could you guys help me out what im missing?

I have my raw array object:

var data = [
 {message:'hello', username:'user1'},
 {message:'data', username:'user1'},
 {message:'sample', username:'user2'},
 {message:'here', username:'user2'},
];

my function is:

var chat = [];
function reorder(obj) {
    obj.forEach( function(val, i) {
        if(typeof chat[val.username] === 'undefined') {
            chat[val.username] = [];
            chat[val.username].push(val);   
        }
        else 
            chat[val.username].push(val);
    });
    return chat;
}

and on my console:

reorder(data);

I am expecting to have:

var data2 = [
  'user1': [{message:'hello', username:'user1'}, {message:'data', username:'user1'} ],
  'user2': [{message:'sample', username:'user2'}, {message:'here', username:'user2'} ],
];

Upvotes: 0

Views: 60

Answers (3)

user663031
user663031

Reputation:

Use Underscore's _.groupBy:

_.groupBy(data, 'username')

Upvotes: 0

Barmar
Barmar

Reputation: 780688

The problem is that you made chat an array. When you look at an array in the console, it only displays the numeric indexes, not the named properties; you have to use console.log(chat) to see the named properties.

Since you want this to be an object with named properties, you should declare it as an object, not an array:

var chat = {};

Upvotes: 0

elclanrs
elclanrs

Reputation: 94101

You can do this easily with reduce:

var data2 = data.reduce(function(acc, x) {
  acc[x.username] = (acc[x.username] || []).concat(x)
  return acc
},{})
/*^
{ user1: 
   [ { message: 'hello', username: 'user1' },
     { message: 'data', username: 'user1' } ],
  user2: 
   [ { message: 'sample', username: 'user2' },
     { message: 'here', username: 'user2' } ] }
*/

Upvotes: 1

Related Questions