【问题标题】:Merge value from one array of JSON into corresponding JSON of another array based on key根据键将一个 JSON 数组中的值合并到另一个数组的对应 JSON 中
【发布时间】:2020-05-15 12:37:02
【问题描述】:

我有两个 JSON 对象数组。一个带有承包商详细信息,另一个带有项目。两者都有一个共同的字段 user_id。

我想要一个结果对象数组,这样每个承包商也有一个他的活动项目数组。示例:

arr1 = [{
    name: 'Contractor A',
    user_id: 3,
    mobile_number: '9999999999',
    active_projects: []
},
{
    name: 'Contractor B',
    user_id: 6,
    mobile_number: '9999999999',
    active_projects: []
}]

arr2 = [{
    user_id: 3, project_name: 'Project A'
},
{
    user_id: 3, project_name: 'Project B'
},
{
    user_id: 6, project_name: 'Project C'
}]

最终的数组应该是:

arr1 = [{
    name: 'Contractor A',
    user_id: 3,
    mobile_number: '9999999999',
    active_projects: ['Project A', 'Project B']
},
{
    name: 'Contractor B',
    user_id: 6,
    mobile_number: '9999999999',
    active_projects: ['Project C']
}]

实现这一目标的最佳/最干净的方法是什么?

【问题讨论】:

    标签: javascript arrays json array-merge


    【解决方案1】:

    您可以使用forEach 迭代arr2,并在回调内部使用findIndexarr1 中查找对象的索引,其user_id 与正在迭代的对象的user_id 匹配。然后使用index 填充第一个数组中的值

    let arr1 = [{
        name: 'Contractor A',
        user_id: 3,
        mobile_number: '9999999999',
        active_projects: []
      },
      {
        name: 'Contractor B',
        user_id: 6,
        mobile_number: '9999999999',
        active_projects: []
      }
    ]
    
    let arr2 = [{
        user_id: 3,
        project_name: 'Project A'
      },
      {
        user_id: 3,
        project_name: 'Project B'
      },
      {
        user_id: 6,
        project_name: 'Project C'
      }
    ];
    
    arr2.forEach((item) => {
      const findIndexArr1 = arr1.findIndex(elem => elem.user_id === item.user_id);
      if (findIndexArr1 !== -1) {
        arr1[findIndexArr1].active_projects.push(item.project_name)
      }
    });
    console.log(arr1)

    【讨论】:

      【解决方案2】:

      您可以使用map 做到这一点:

      var arr1 = [ { name: 'Contractor A', user_id: 3, mobile_number: '9999999999', active_projects: [] }, { name: 'Contractor B', user_id: 6, mobile_number: '9999999999', active_projects: [] } ],
      arr2 = [ { user_id: 3, project_name: 'Project A' }, { user_id: 3, project_name: 'Project B' }, { user_id: 6, project_name: 'Project C' }];
      
      var result = arr1.map(({active_projects,...rest})=> ({...rest, active_projects: arr2.filter(k=>k.user_id==rest.user_id).map(name=>name.project_name)}));
      
      console.log(result);

      【讨论】:

        【解决方案3】:

        您也可以使用嵌套的for

        for(i in arr1){
          for(j in arr2){
            if(arr1[i].user_id === arr2[j].user_id) {
              arr1[i].active_projects.push(arr2[j].project_name)
            }
          }
        }
        

        【讨论】:

          【解决方案4】:

          您可以将project_nameuser_id 分组,然后将map 分组为您的arr1

          const grouped = arr2.reduce((a, {user_id, project_name}) => {
              a[user_id] = a[user_id] || [];
              a[user_id].push(project_name);
              return a;
          },{})
          
          arr1 = arr1.map(({user_id, active_projects, ...rest}) => ({user_id, 
              active_projects: grouped[user_id], ...rest}));
          

          一个例子:

          arr1 = [{
              name: 'Contractor A',
              user_id: 3,
              mobile_number: '9999999999',
              active_projects: []
          },
          {
              name: 'Contractor B',
              user_id: 6,
              mobile_number: '9999999999',
              active_projects: []
          }]
          
          arr2 = [{
              user_id: 3, project_name: 'Project A'
          },
          {
              user_id: 3, project_name: 'Project B'
          },
          {
              user_id: 6, project_name: 'Project C'
          }]
          
          const grouped = arr2.reduce((a, {user_id, project_name}) => {
              a[user_id] = a[user_id] || [];
              a[user_id].push(project_name);
              return a;
          },{})
          
          arr1 = arr1.map(({user_id, active_projects, ...rest}) => ({user_id, active_projects: grouped[user_id], ...rest}));
          console.log(arr1)

          【讨论】:

            猜你喜欢
            • 2023-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多