Javascript 按嵌套数组的唯一值对数组进行分组

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 : [ {

从下面的数组开始,在JavaScript中,使用Lodash,如何按唯一用户对任务进行分组,以输出下面的“tasks\u by\u 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来清理数组。