【问题标题】:how to group an array by dynamic key?如何通过动态键对数组进行分组?
【发布时间】:2020-10-21 04:55:02
【问题描述】:

所以我有一个数组,我想按给定的 id 对值进行分组,我尝试了一种方法,但它不适用于动态键。 这是我的数组

let employees = [{"employeeDetail": [{"empID": "XXYYZZ11","firstname": "abc","joinedAt": "13/04/2014", "address": "VVGGHHNN" }],"employeeSalaryDetails": [{"month": "Jan","salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"employeeDetails": [{"empID": "XXYYZZ11","firstname": "abc",   "joinedAt": "13/04/2014","address": "VVGGHHNN"}],"employeeSalaryDetails": [{"month": "Feb",  "salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"employeeDetails": [{"empID": "XXYYZZ22","firstname": "abc",   "joinedAt": "13/04/2014","address": "VVGGHHNN"}],"employeeSalaryDetails": [{"month": "Jan",  "salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]}]

我希望这个数组是这样的

[{"empID": "XXYYZZ11","firstname": "abc","joinedAt": "13/04/2014","address": "VVGGHHNN","employeeSalaryDetails": [{"month": "Jan","salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}, {"month": "Feb","salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"empID": "XXYYZZ22","firstname": "abc","joinedAt": "13/04/2014","employeeSalaryDetails": [{"month": "Jan","salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]}]

我试过这个方法,它适用于employeeDetails键,但我想重用这个方法,如果employeeDetailsdetails在employees数组中,它应该工作,但是按方法不起作用

    let employees = [{"employeeDetail": [{"empID": "XXYYZZ11","firstname": "abc","joinedAt": "13/04/2014", "address": "VVGGHHNN" }],"employeeSalaryDetails": [{"month": "Jan","salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"employeeDetails": [{"empID": "XXYYZZ11","firstname": "abc",   "joinedAt": "13/04/2014","address": "VVGGHHNN"}],"employeeSalaryDetails": [{"month": "Feb",  "salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"employeeDetails": [{"empID": "XXYYZZ22","firstname": "abc",   "joinedAt": "13/04/2014","address": "VVGGHHNN"}],"employeeSalaryDetails": [{"month": "Jan",  "salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]}]

    function employeeGroup(empArray, key) {
       return Object.values(empArray.reduce(
          (obj, { employeeDetails: [item], employeeSalaryDetails }) => {
             (obj[item[key]] = obj[item[key]] || { ...item, employeeSalaryDetails: [] })
                .employeeSalaryDetails.push(...employeeSalaryDetails)
                return obj
       }, {}))
    }
    console.log(
    employeeGroup(employees,'empID')
    )

我需要这个 employeeDetails: [item] 是动态的,如果员工数组有 details 而不是 employeeDetails。我需要 details: [item] 这是动态变化的,请注意不是 employees 的数据结构,有什么帮助吗?

【问题讨论】:

  • 输入和输出看起来一样。您可能需要更好地澄清它
  • 哦,我以为你想要更复杂的东西。看起来您唯一想要的是将整个数组传递给新对象?将 [item] 更改为 details 并使用 details[0] 代替 item,并将 ...item 更改为 employeeDetails: details
  • @user120242 立即查看
  • 我按照你说的试过了,但是没用,你能不能把答案贴出来?
  • 你是说key有时会是employeeDetail或者employeeDetails?或者说它甚至可能是详细信息或详细信息或员工详细信息或员工详细信息或其他键名?有图案吗?程序应该如何判断它是否是正确的键?

标签: javascript node.js typescript express ecmascript-6


【解决方案1】:

只是尝试提取employeeDetails 和details,尝试使用存在的那个。

let employees = [{"details": [{"empID": "XXYYZZ11","firstname": "abc","joinedAt": "13/04/2014", "address": "VVGGHHNN" }],"employeeSalaryDetails": [{"month": "Jan","salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"employeeDetails": [{"empID": "XXYYZZ11","firstname": "abc",   "joinedAt": "13/04/2014","address": "VVGGHHNN"}],"employeeSalaryDetails": [{"month": "Feb",  "salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]},{"employeeDetails": [{"empID": "XXYYZZ22","firstname": "abc",   "joinedAt": "13/04/2014","address": "VVGGHHNN"}],"employeeSalaryDetails": [{"month": "Jan",  "salaryAmount": "35000","Bank": "XXXXX","PfAccnum": "XXAAQQWWWWQ"}]}]

function employeeGroup(empArray, key) {
   return Object.values(empArray.reduce(
      (obj, { employeeDetails: [item1]=[], details: [item2]=[], employeeSalaryDetails }) => {
         const item = item1 || item2
         ;(obj[item[key]] = obj[item[key]] || { ...item, employeeSalaryDetails: [] })
            .employeeSalaryDetails.push(...employeeSalaryDetails)
            return obj
   }, {}))
}

    console.log(
    employeeGroup(employees,'empID')
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2022-01-11
    • 2016-09-10
    相关资源
    最近更新 更多