通过javascript重新排序数组对象

时间:2014-09-11 06:13:29

标签: 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'} ],
];

3 个答案:

答案 0 :(得分: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' } ] }
*/

答案 1 :(得分:0)

问题是你使chat成为一个数组。在控制台中查看数组时,它只显示数字索引,而不是命名属性;您必须使用console.log(chat)来查看命名属性。

由于您希望它是具有命名属性的对象,因此您应将其声明为对象,而不是数组:

var chat = {};

答案 2 :(得分:0)

使用下划线_.groupBy

_.groupBy(data, 'username')