我一直在做一些排序,但仍然没有得到它为什么结果是[]。你能帮我解决一下我失踪的事吗?
我有我的原始数组对象:
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'} ],
];
答案 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')