首页 > 解决方案 > 根据主ID和子ID合并数组内的对象

问题描述

我正在尝试将数据推送到具有主 ID 的数组中,然后根据主 ID 和子 ID 对子选项进行分组。但是,当我 console.log arrayExample 时,对象不是基于 Primary_id 和 sub_id 的合并

const listOfPrimaryId = [{ primary_id: '1234' }, { primary_id: '2345' }, { primary_id: '3456' }]

const arrayNumberOne = [{ main_id: '1234', sub_id: 'htx', indv_ids: 'bf' }, { main_id: '2345', sub_id: 'htx', indv_ids: 'gg' }, { main_id: '3456', sub_id: 'sam', indv_ids: 'bg' }, { main_id: '3456', sub_id: 'sam', indv_ids: 'hh' }, { main_id: '1234', sub_id: 'kev', indv_ids: 'app' }]

const arrayExample = []

for (let j = 0; j < listOfPrimaryId.length; j++) {
    let diffPrimaryId = listOfPrimaryId[j]['primary_id']

    for (let i = 0; i < arrayNumberOne.length; i++) {
        let primaryId = arrayNumberOne[i]['main_id'];
        let subId = arrayNumberOne[i]['sub_id'];
        let iDOptions = arrayNumberOne[i]['indv_ids']

        if (primaryId == diffPrimaryId) {

            type InnerFish = {
                sub_id: string;
                id_opt: string[];
            }

            type MainFish = {
                primary_id: string;
                package: InnerFish
            }

            let sampleData2: InnerFish = {
                sub_id: subId,
                id_opt: [iDOptions]
            }

            let sampleData: MainFish = {
                primary_id: primaryId,
                package: sampleData2
            }

            arrayExample.push(sampleData)
        }
    }
}

执行上述操作后,我得到了 arrayExample 的以下输出。

[
  { primary_id: '1234', package: { sub_id: 'htx', id_opt: ['bf'] } },
  { primary_id: '1234', package: { sub_id: 'kev', id_opt: ['app'] } },
  { primary_id: '2345', package: { sub_id: 'htx', id_opt: ['gg'] } },
  { primary_id: '3456', package: { sub_id: 'sam', id_opt: ['bg'] } },
  { primary_id: '3456', package: { sub_id: 'sam', id_opt: ['hh'] } }
]

arrayExample 不组合 primary_id 或 sub_id。我正在尝试将数据构建为类似于以下输出。

[
       { primary_id: '1234', package: [ { sub_id: 'htx', id_opt: ['bf'] }, { sub_id: 'kev', id_opt: ['app'] } ] },
       { primary_id: '2345', package: [ { sub_id: 'htx', id_opt: ['gg'] } ] },
       { primary_id: '3456', package: [ { sub_id: 'sam', id_opt: ['bg', 'hh'] } ] },
]

标签: typescript

解决方案


在您的示例中,您实际上从未合并数组。这可能是一个更好的解决方案。

type InnerItem = { main_id: string, sub_id: string, indv_ids: string };

const arrayExample = listOfPrimaryId.map((primaryItem:{ primary_id: string }) => {
  const package: {sub_id: string, id_opt: string[]} = [];

  arrayNumberOne.forEach((innerItem: InnerItem ) => {
    if(innerItem.main_id === primaryItem.primary_id){
       // check if we added sub item to package array already
      const existingIndex = package.findIndex((val)=> val.sub_id === innerItem.sub_id);
      if(existingIndex >= 0) // if we have
        package[existingIndex].id_opt.push(innerItem.indv_ids)
      else // if not add it
        package.push( {sub_id: innerItem.sub_id, id_opt: [innerItem. indv_ids]}
    }  
  });
  return { primary_id: primaryItem.primary_id, package};
});

您可以更改类型声明。


推荐阅读