typescript - 根据主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'] } ] },
]
解决方案
在您的示例中,您实际上从未合并数组。这可能是一个更好的解决方案。
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};
});
您可以更改类型声明。
推荐阅读
- python - 如何使用算法从矩阵中选择列
- java - 如何修复启动 eclipse 时出现的这个错误日志?
- python-3.x - 是否有类似多元曲线拟合函数的 numpy.polyfit ?
- c# - Unity Post-processing PostProcessEffectRenderer 显示在编辑器中但不在构建中
- sql - 在 Redshift 查询中为 max(date) 函数指定意外事件
- java - 如何使用正则表达式拆分此字符串“-25+26+78-21”以获得-25、26、78、-21?
- python - 如何在python中将两个pdf页面拼接成一个
- git - 如何在 GitHub 上使用其他人的 pull request 中的代码?
- python - 如何将以 1 开头的数字添加到列表中?
- ruby-on-rails - GoDaddy VPS 配置上的 Ruby on Rails