2014-09-11 50 views
0

我一直在做一些排序,但仍然没有得到它为什么结果是[]。你们能帮我解决我错过了什么吗?通过JavaScript重新排序数组对象

我有我的原数组对象:

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

我的功能是:

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; 
} 

和我的控制台上:

reorder(data); 

我期待着有:

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

'聊天[VAL。 .username]'是不是有效的语法,你没有得到一个语法错误?它实际上是“聊天[val.username]”吗? – Barmar 2014-09-11 06:14:52

+0

你把结果分配给'data2'的地方? – Barmar 2014-09-11 06:16:18

+0

为什么不把“聊天”的init作为第一件事进入重新排序功能? – 2014-09-11 06:17:35

回答

1

你可以用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' } ] } 
*/ 
+0

COOL以外声明了var data2!我不知道这有一个功能!谢谢!人。它是怎么做到的?! – loki9 2014-09-11 06:23:04

0

的问题是,你做chat数组。当您查看控制台中的数组时,它只显示数字索引,而不显示命名属性;您必须使用console.log(chat)才能查看指定的属性。

既然你想这是与名为属性的对象,你应该把它声明为一个对象,而不是一个数组:

var chat = {}; 
0

使用下划线的_.groupBy

_.groupBy(data, 'username')