如何编写JavaScript函数实现文档数据按后缀编号分组转换?
问题:按realName后缀编号分组转换数组格式
需求说明
需要编写JavaScript函数,将指定REQUEST格式的数组数据转换为RESPONSE格式的数组,核心规则是把realName后缀编号相同的文档对象归到同一个响应对象中。
REQUEST示例
[ { "realName": "OnlineOrderDoc-1", "preparedBy": "Jack" }, { "realName": "GroceryBillDoc-2", "preparedBy": "Jill" }, { "realName": "makingChargeDoc-2", "preparedBy": "John" }, { "realName": "GroceryBillDoc-3", "preparedBy": "Sam" }, { "realName": "makingChargeDoc-3", "preparedBy": "Bill" } ]
RESPONSE示例
[ { "OnlineOrderDoc": { "preparedBy": "Jack" } }, { "GroceryBillDoc": { "preparedBy": "Jill" }, "makingChargeDoc": { "preparedBy": "John" } }, { "GroceryBillDoc": { "preparedBy": "Sam" }, "makingChargeDoc": { "preparedBy": "Bill" } } ]
你的代码问题排查
你尝试用Map实现,但代码存在多处逻辑错误,导致无法正常运行:
- 变量名错误:使用了未定义的
name、filename变量,正确的应该是newName和包含preparedBy的对象 - 分组依据错误:你用文档名(
newName)作为Map的key,但需求是按后缀编号分组,应该用numberFromName作为key - 结构赋值错误:更新Map值时的对象合并逻辑混乱,没有正确构建目标结构
可行解决方案
正确思路是用后缀编号作为Map的key,存储对应编号下的所有文档对象,最后将Map的值转为数组即可:
const transformRequest = (request) => { // 用Map存储编号对应的文档集合,key是后缀编号,value是该编号下的文档对象 const groupMap = new Map(); request.forEach(item => { // 拆分realName得到文档名和后缀编号 const [docName, number] = item.realName.split('-'); // 从Map中获取当前编号对应的文档集合,不存在则创建空对象 const currentGroup = groupMap.get(number) || {}; // 将当前文档信息添加到集合中 currentGroup[docName] = { preparedBy: item.preparedBy }; // 更新Map中的对应项 groupMap.set(number, currentGroup); }); // 将Map的value转为数组,就是目标格式 return Array.from(groupMap.values()); }
代码说明
- 遍历原数组时,拆分每个元素的
realName得到文档名和后缀编号 - 以编号为key在Map中查找对应的分组对象,不存在则初始化空对象
- 把当前文档的
preparedBy信息添加到分组对象中,键为文档名 - 最后将Map中存储的所有分组对象转为数组,得到最终结果
内容的提问来源于stack exchange,提问作者Author
相关产品推荐
相关产品推荐

