You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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] !== '&quot;') {
      var str_colon = str_array[i];

      if (str_colon !== '&quot;') {
        if (str_colon !== undefined) {
          const part_detail = str_colon.split(':');
          storeList.store = part_detail[0]
            partList = {
            &quot;part&quot;: part_detail[0],
            &quot;qtyOnHand&quot;: part_detail[1],
            &quot;qtyMinMax&quot;: 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] !== '&quot;') {
    populate_part(str_array[i]);
  }
}
retun(JSON.stringify(storeList));

问题原因分析

  • 重复循环调用:外层循环遍历处理后的hdr_str字符串长度(远大于实际条目数),每次循环都调用populate_part,而populate_part内部又遍历整个str_array,导致每个零件项被重复添加多次。
  • 数据解析错误:直接用split(':')拆分的结果包含大括号,无法得到纯净的store、数量和零件值,且未正确拆分零件对与数量对。
  • 变量逻辑混乱:partList被重新赋值为单个零件对象,覆盖了初始数组引用;存在语法错误(如retun拼写错误、&quot;转义错误)。
  • 冗余代码:后续对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:42:03