JavaScript字符串转指定JSON格式:代码生成重复数据问题排查
问题:字符串转指定JSON结构时partList重复问题
需求描述
将输入字符串'{RS0004036}:{1;2}:{0000003AB;0000003BC}_{RS0004036}:{0;3}:{0000003DE;0000003FG}_{RS0004036}:{3;3}:{0000003HI;0000003JK}'转换为指定结构的JSON,要求store字段唯一,partList为对应零件列表。原代码生成大量重复的partList项,需排查问题并修正代码。
目标JSON结构
{ "storeList": [ { "store": "RS0004036", "partList": [ { "part": "0000003AB", "partSub": "0000003BC", "qtyOnHand": "1", "qtyMinMax": "2" }, { "part": "0000003DE", "partSub": "0000003FG", "qtyOnHand": "0", "qtyMinMax": "3" }, { "part": "0000003HI", "partSub": "0000003JK", "qtyOnHand": "3", "qtyMinMax": "3" } ] } ] }
原代码
String.prototype.replaceAll = function replaceAll(search, replace) { return this.split(search).join(replace); } var storeList = {}; var partList = []; storeList.partList = partList; var hdr_str = '{RS0004036}:{1;2}:{0000003AB;0000003BC}_{RS0004036}:{0;3}:{0000003DE;0000003FG}_{RS0004036}:{3;3}:{0000003HI;0000003JK}'; var sites_ar = []; var str_array = hdr_str.split('_'); var str_us = []; var qty_ar = []; var hdr_parts = []; var part_semi = []; var part_detail = []; function populate_part(str_in) { for (var i = 0; i < str_array.length; i++) { if (str_array[i] !== '"') { var str_colon = str_array[i]; if (str_colon !== '"') { if (str_colon !== undefined) { const part_detail = str_colon.split(':'); storeList.store = part_detail[0] partList = { "part": part_detail[0], "qtyOnHand": part_detail[1], "qtyMinMax": part_detail[2] } storeList.partList.push(partList); } } } } } pattern = ';'; replacement = ','; hdr_str = hdr_str.replaceAll(pattern, replacement); pattern = ':'; replacement = ','; hdr_str = hdr_str.replaceAll(pattern, replacement); hdr_str = '[' + hdr_str + ']'; for (var i = 0; i < hdr_str.length; i++) { if (str_array[i] !== '"') { populate_part(str_array[i]); } } retun(JSON.stringify(storeList));
问题原因分析
- 重复循环调用:外层循环遍历处理后的
hdr_str字符串长度(远大于实际条目数),每次循环都调用populate_part,而populate_part内部又遍历整个str_array,导致每个零件项被重复添加多次。 - 数据解析错误:直接用
split(':')拆分的结果包含大括号,无法得到纯净的store、数量和零件值,且未正确拆分零件对与数量对。 - 变量逻辑混乱:
partList被重新赋值为单个零件对象,覆盖了初始数组引用;存在语法错误(如retun拼写错误、"转义错误)。 - 冗余代码:后续对
hdr_str的字符串转换未实际使用,属于无效操作。
修正后的代码
function parseStoreData(inputStr) { // 初始化结果结构 const storeList = { storeList: [] }; const storeMap = new Map(); // 用Map确保store唯一 // 拆分每个store-零件条目 const items = inputStr.split('_'); items.forEach(item => { // 拆分条目为三部分:store、数量对、零件对 const [storePart, qtyPart, partPairPart] = item.split(':'); // 去除大括号,提取纯净值 const store = storePart.replace(/\{|\}/g, ''); const [qtyOnHand, qtyMinMax] = qtyPart.replace(/\{|\}/g, '').split(';'); const [part, partSub] = partPairPart.replace(/\{|\}/g, '').split(';'); // 若store不存在则创建新对象 if (!storeMap.has(store)) { storeMap.set(store, { store: store, partList: [] }); } // 添加零件到对应store的partList storeMap.get(store).partList.push({ part: part, partSub: partSub, qtyOnHand: qtyOnHand, qtyMinMax: qtyMinMax }); }); // 将Map转换为数组存入结果 storeList.storeList = Array.from(storeMap.values()); return JSON.stringify(storeList, null, 2); } // 测试执行 const hdr_str = '{RS0004036}:{1;2}:{0000003AB;0000003BC}_{RS0004036}:{0;3}:{0000003DE;0000003FG}_{RS0004036}:{3;3}:{0000003HI;0000003JK}'; console.log(parseStoreData(hdr_str));
修正说明
- 避免重复添加:直接遍历拆分后的条目数组,每个条目仅处理一次。
- 准确解析数据:用正则去除大括号,拆分出对应字段值,完美匹配目标结构。
- 保证store唯一:通过
Map自动去重相同store,零件统一添加到对应partList。 - 清理冗余代码:移除无效的字符串转换与未使用变量,逻辑更简洁。
- 修复语法错误:修正拼写、转义等问题,代码符合JavaScript规范。
内容的提问来源于stack exchange,提问作者Curo
相关产品推荐
相关产品推荐

