首页 > 解决方案 > 将数组与javascript中的嵌套数组进行比较

问题描述

我有两个数组,一个是accounts,另一个是departments

要求:

-> 需要比较两个数组并需要得到过滤后的帐户数组。

-> 帐户数组是单级的,而部门数组有两级,我需要比较JobTitleID帐户和部门的值。

-> 最后返回带有过滤数据的修改后的帐户数组。

const accounts = [
  {
    "AccountId": 25205,
    "CandidateID": 8474,
    "JobTitleID": 250
  },
  {
    "AccountId": 25206,
    "CandidateID": 8474,
    "JobTitleID": 253
  },
  {
    "AccountId": 25232,
    "CandidateID": 8474,
    "JobTitleID": 257
  },
  {
    "AccountId": 25233,
    "CandidateID": 8474,
    "JobTitleID": 261
  },
  {
    "AccountId": 25236,
    "CandidateID": 8474,
    "JobTitleID": 256
  },
  {
    "AccountId": 25237,
    "CandidateID": 8474,
    "JobTitleID": 255
  },
  {
    "AccountId": 25245,
    "CandidateID": 8474,
    "JobTitleID": 281
  },
  {
    "AccountId": 25246,
    "CandidateID": 8474,
    "JobTitleID": 279
  },
  {
    "AccountId": 25265,
    "CandidateID": 8474,
    "JobTitleID": 362
  }
]




const departments = [
  {
    "deptName": "Production",
    "jobTitles": [
      {
        "JobTitleID": 246,
        "DepartmentID": 72,
        "JobName": "Department Foreman"
      },
      {
        "JobTitleID": 357,
        "DepartmentID": 72,
        "JobName": "Maintenance Supervisor"
      },
      {
        "JobTitleID": 247,
        "DepartmentID": 72,
        "JobName": "Production Manager"
      },
      {
        "JobTitleID": 362,
        "DepartmentID": 72,
        "JobName": "Safety & Compliance Supervisor"
      }
    ]
  },
  {
    "deptName": "Engineering",
    "jobTitles": [
      {
        "JobTitleID": 250,
        "DepartmentID": 73,
        "JobName": "Architect"
      },
      {
        "JobTitleID": 248,
        "DepartmentID": 73,
        "JobName": "CAD Operator"
      },
      {
        "JobTitleID": 249,
        "DepartmentID": 73,
        "JobName": "Engineering Manager"
      },
      {
        "JobTitleID": 251,
        "DepartmentID": 73,
        "JobName": "Professional Engineer"
      }
    ]
  },
  {
    "deptName": "Purchasing",
    "jobTitles": [
      {
        "JobTitleID": 253,
        "DepartmentID": 74,
        "JobName": "Purchasing Agent"
      },
      {
        "JobTitleID": 255,
        "DepartmentID": 74,
        "JobName": "Purchasing Manager"
      },
      {
        "JobTitleID": 252,
        "DepartmentID": 74,
        "JobName": "Yard Foreman"
      }
    ]
  }
]





const filteredData = accounts.map(item => {
   departments.map(levelOne => {
       levelOne.jobTitles.map(levelTwo => {
          return levelTwo.JobTitleID === item.JobTitleID
     })
  })              
})

console.log('filteredData ', filteredData)

预期解决方案:

[
  {
    "AccountId": 25205,
    "CandidateID": 8474,
    "JobTitleID": 250
  },
  {
    "AccountId": 25206,
    "CandidateID": 8474,
    "JobTitleID": 253
  },
  {
    "AccountId": 25237,
    "CandidateID": 8474,
    "JobTitleID": 255
  },
  {
    "AccountId": 25265,
    "CandidateID": 8474,
    "JobTitleID": 362
  }
]

我尝试过的事情:

const filteredData = accounts.map(item => {
   departments.map(levelOne => {
       levelOne.jobTitles.map(levelTwo => {
          return levelTwo.JobTitleID === item.JobTitleID
     })
  })              
})

但我相信我的方法是完全错误的。请帮助我通过比较两个数组来实现预期的解决方案。在此先感谢。

标签: javascriptarrays

解决方案


您可以创建数组中所有作业的departments数组,然后使用过滤accounts数组.some(..)以检查特定作业是否存在于先前生成的数组中。这是一个例子:

const accounts = [
  {
    "AccountId": 25205,
    "CandidateID": 8474,
    "JobTitleID": 250
  },
  {
    "AccountId": 25206,
    "CandidateID": 8474,
    "JobTitleID": 253
  },
  {
    "AccountId": 25232,
    "CandidateID": 8474,
    "JobTitleID": 257
  },
  {
    "AccountId": 25233,
    "CandidateID": 8474,
    "JobTitleID": 261
  },
  {
    "AccountId": 25236,
    "CandidateID": 8474,
    "JobTitleID": 256
  },
  {
    "AccountId": 25237,
    "CandidateID": 8474,
    "JobTitleID": 255
  },
  {
    "AccountId": 25245,
    "CandidateID": 8474,
    "JobTitleID": 281
  },
  {
    "AccountId": 25246,
    "CandidateID": 8474,
    "JobTitleID": 279
  },
  {
    "AccountId": 25265,
    "CandidateID": 8474,
    "JobTitleID": 362
  }
]




const departments = [
  {
    "deptName": "Production",
    "jobTitles": [
      {
        "JobTitleID": 246,
        "DepartmentID": 72,
        "JobName": "Department Foreman"
      },
      {
        "JobTitleID": 357,
        "DepartmentID": 72,
        "JobName": "Maintenance Supervisor"
      },
      {
        "JobTitleID": 247,
        "DepartmentID": 72,
        "JobName": "Production Manager"
      },
      {
        "JobTitleID": 362,
        "DepartmentID": 72,
        "JobName": "Safety & Compliance Supervisor"
      }
    ]
  },
  {
    "deptName": "Engineering",
    "jobTitles": [
      {
        "JobTitleID": 250,
        "DepartmentID": 73,
        "JobName": "Architect"
      },
      {
        "JobTitleID": 248,
        "DepartmentID": 73,
        "JobName": "CAD Operator"
      },
      {
        "JobTitleID": 249,
        "DepartmentID": 73,
        "JobName": "Engineering Manager"
      },
      {
        "JobTitleID": 251,
        "DepartmentID": 73,
        "JobName": "Professional Engineer"
      }
    ]
  },
  {
    "deptName": "Purchasing",
    "jobTitles": [
      {
        "JobTitleID": 253,
        "DepartmentID": 74,
        "JobName": "Purchasing Agent"
      },
      {
        "JobTitleID": 255,
        "DepartmentID": 74,
        "JobName": "Purchasing Manager"
      },
      {
        "JobTitleID": 252,
        "DepartmentID": 74,
        "JobName": "Yard Foreman"
      }
    ]
  }
]

const jobs = departments.reduce((a, c) => (a.concat(c.jobTitles)), []);
const results = accounts.filter(account => jobs.some(job => job.JobTitleID === account.JobTitleID));

console.log(results);


推荐阅读