Javascript 按嵌套数组的唯一值对数组进行分组
从下面的数组开始,在JavaScript中,使用Lodash,如何按唯一用户对任务进行分组,以输出下面的“tasks\u by\u user”数组 输入:Javascript 按嵌套数组的唯一值对数组进行分组,javascript,arrays,lodash,Javascript,Arrays,Lodash,从下面的数组开始,在JavaScript中,使用Lodash,如何按唯一用户对任务进行分组,以输出下面的“tasks\u by\u user”数组 输入: tasks: [ { name: "buy milk", users: [ "123", "456" ] }, { name: "get bread", users: [ "123" ] } ] 输出: tasks_by_user : [ {
tasks: [
{
name: "buy milk",
users: [
"123", "456"
]
},
{
name: "get bread",
users: [
"123"
]
}
]
输出:
tasks_by_user : [
{
user: "123",
tasks: [
{
name: "buy milk"
},
{
name: "get bread"
}
]
},
{
user: "456",
tasks: [
{
name: "buy milk"
}
]
}
]
您可以使用
reduce
和forEach
方法来实现这一点
const data=[{“name”:“buy milk”,“users”:[“123”,“456”]},{“name”:“get bread”,“users”:[“123”]}]
让结果=u.values(u.reduce(数据,(r,{name,users})=>{
_.forEach(用户,用户=>{
如果(!r[user])r[user]={
用户,
任务:[]
}
r[user].tasks.push({name})
})
返回r;
}, {}))
console.log(结果)
普通javascript解决方案
const data = [{
"name": "buy milk",
"users": ["123", "456"]
}, {
"name": "get bread",
"users": ["123"]
}];
var result = data.reduce((acc, {name, users}) => {
users.forEach(u => {
acc[u] = (acc[u] || []);
acc[u].push(name);
});
return acc;
}, {});
console.log(Object.getOwnPropertyNames(result).map(user => {
return {
user,
tasks: result[user]
};
}));
通过按用户id对输入数据进行分组,然后将分组后的对象映射到数组,可以使用本机执行此操作:
const tasks=[{name:“买牛奶”,用户:[“123”,“456”]},{name:“买面包”,用户:[“123”]};
var dataObj=tasks.reduce((all,{name,users})=>{
users.forEach(user=>{
如果(!all.hasOwnProperty(user))all[user]={user,tasks:[]};
所有[user].tasks.push({name});
})
全部归还;
}, {});
var tasks_by_user=Object.keys(dataObj.map)(k=>dataObj[k]);
console.log(任务由用户完成)代码>@trs,您也可以尝试以下代码
/* Input array */
var tasks = {tasks: [
{
name: "buy milk",
users: [
"123", "456"
]
},
{
name: "get bread",
users: [
"123"
]
}
]}
var inputArr = tasks['tasks']
/* Creating output array */
var outputArr = []
var outputObj = {}
for(var obj of inputArr){
for(var user of obj["users"]){
var o = {'name': obj['name']}
if(outputObj[user] == undefined){
outputObj[user] = [o]
} else {
outputObj[user].push(o)
}
}
}
console.log(JSON.stringify(outputObj, null, 4))
/*
{
"123": [
{
"name": "buy milk"
},
{
"name": "get bread"
}
],
"456": [
{
"name": "buy milk"
}
]
}
*/
for(var key in outputObj) {
outputArr.push({'user': key, 'tasks': outputObj[key]})
}
console.log(JSON.stringify(outputArr, null, 4))
/*
[
{
"user": "123",
"tasks": [
{
"name": "buy milk"
},
{
"name": "get bread"
}
]
},
{
"user": "456",
"tasks": [
{
"name": "buy milk"
}
]
}
]
*/
最终输出:
[
{
"user": "123",
"tasks": [
{
"name": "buy milk"
},
{
"name": "get bread"
}
]
},
{
"user": "456",
"tasks": [
{
"name": "buy milk"
}
]
}
]
你能分享一下你的代码吗?我尝试过的所有东西(如u、map、u.groupBy等组合)都不起作用……我认为你应该重新考虑数据的组织。你想要实现的是可能的,但如此复杂,我对输入数据没有选择。是的!谢谢你,尼纳德。虽然我得到了一个额外的“键”,所以我在最后添加了一个uz.map来清理数组。