在Jolt中能否遍历嵌套数组并利用外层索引生成一维数组输出?
如何将嵌套的users数组转换为扁平的staffs数组?
需求:遍历输入中的users数组,保持原有顺序生成一个无嵌套结构的staffs数组。其中:
- 类型为"A"的用户,直接提取
firstName和lastName转换为staffFirstName和staffLastName - 类型为"B"的用户,需要展开其
subUsers数组,将每个子用户的subUserFirstName和subUserLastName转换为对应字段
输入示例
{ "users": [ { "type": "A", "firstName": "Abc", "lastName": "Def" }, { "type": "B", "subUsers": [ { "subUserFirstName": "Mno", "subUserLastName": "Pqr" }, { "subUserFirstName": "Stu", "subUserLastName": "Vwi" } ] }, { "type": "A", "firstName": "Ghi", "lastName": "Jkl" } ] }
预期输出
{ "staffs": [ { "staffFirstName": "Abc", "staffLastName": "Def" }, { "staffFirstName": "Mno", "staffLastName": "Pqr" }, { "staffFirstName": "Stu", "staffLastName": "Vwi" }, { "staffFirstName": "Ghi", "staffLastName": "Jkl" } ] }
解决方案(JavaScript)
const input = { "users": [ { "type": "A", "firstName": "Abc", "lastName": "Def" }, { "type": "B", "subUsers": [ { "subUserFirstName": "Mno", "subUserLastName": "Pqr" }, { "subUserFirstName": "Stu", "subUserLastName": "Vwi" } ] }, { "type": "A", "firstName": "Ghi", "lastName": "Jkl" } ] }; const result = { staffs: input.users.flatMap(user => { // 处理类型A的用户 if (user.type === 'A') { return [{ staffFirstName: user.firstName, staffLastName: user.lastName }]; } // 处理类型B的用户,展开subUsers else if (user.type === 'B') { return user.subUsers.map(subUser => ({ staffFirstName: subUser.subUserFirstName, staffLastName: subUser.subUserLastName })); } // 未知类型返回空数组,不影响最终结果 return []; }) }; // 输出格式化后的结果 console.log(JSON.stringify(result, null, 2));
代码说明
- 使用
flatMap替代普通map,可以在遍历的同时自动展开嵌套数组,一步得到扁平结构的staffs数组 - 对类型A的用户,返回包含单个转换后对象的数组,
flatMap会直接保留这个对象 - 对类型B的用户,用
map转换subUsers中的每个元素,返回转换后的数组,flatMap会将这个数组展开到最终结果中 - 增加了未知类型的处理逻辑,避免出现意外数据
内容的提问来源于stack exchange,提问作者Kaushik
相关产品推荐
相关产品推荐

