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

如何编写函数重构XLSX导出的JSON响应数据结构

重构XLSX导出的JSON层级结构

刚好碰到过类似的XLSX导出结构问题,直接给你一个可复用的JavaScript函数来完成重构,完全匹配你想要的嵌套结构:

首先先明确输入输出的对比:

原始输入JSON

{
  "Produtos": [
    [ "SP", "Hamburgueria" ],
    [ null, null, "IN00001282", "Batata 7 MM Corte Fino McCain 2,25 Kg - Caixa com 8 Unidades", "$8.85", "$1.11" ],
    [ null, null, "IN000155937", "Copo De Fritas 480 ml Kraft - 1000 Unidades", "$394.74", "$0.39" ]
  ]
}

期望输出JSON

{
  "Produtos": {
    "SP": {
      "Hamburgueria": [
        [ null, null, "IN00001282", "Batata 7 MM Corte Fino McCain 2,25 Kg - Caixa com 8 Unidades", "$8.85", "$1.11" ],
        [ null, null, "IN000155937", "Copo De Fritas 480 ml Kraft - 1000 Unidades", "$394.74", "$0.39" ]
      ]
    }
  }
}

(注:你示例里的商品名是截断的,如果你需要截断长名称,可以看后面的扩展处理)


重构函数实现

function restructureProductData(originalJson) {
  // 提取第一组数据作为地区和门店名称
  const [region, storeName] = originalJson.Produtos[0];
  
  // 提取后续所有子数组作为该门店的商品列表
  const storeProducts = originalJson.Produtos.slice(1);
  
  // 构建嵌套结构,用计算属性名动态生成键
  return {
    Produtos: {
      [region]: {
        [storeName]: storeProducts
      }
    }
  };
}

// 测试使用
const originalData = {
  "Produtos": [
    [ "SP", "Hamburgueria" ],
    [ null, null, "IN00001282", "Batata 7 MM Corte Fino McCain 2,25 Kg - Caixa com 8 Unidades", "$8.85", "$1.11" ],
    [ null, null, "IN000155937", "Copo De Fritas 480 ml Kraft - 1000 Unidades", "$394.74", "$0.39" ]
  ]
};

const restructuredData = restructureProductData(originalData);
console.log(JSON.stringify(restructuredData, null, 2));

代码解释

  1. 提取层级信息:从originalJson.Produtos的第一个子数组里,解构出地区(SP)和门店名(Hamburgueria)。
  2. 收集商品列表:用slice(1)跳过第一个层级数组,把剩下的所有商品子数组收集起来。
  3. 构建嵌套对象:利用ES6的计算属性名([region]和[storeName]),动态把地区和门店作为对象的键,商品列表放到对应的门店下。

扩展:截断长商品名称

如果你需要像示例里那样截断过长的商品名称,可以在收集商品列表时添加一个映射处理:

const storeProducts = originalJson.Produtos.slice(1).map(product => {
  const updatedProduct = [...product];
  // 商品名称在数组的第4个位置(索引3),这里设置截断到30个字符
  const maxNameLength = 30;
  if (updatedProduct[3] && updatedProduct[3].length > maxNameLength) {
    updatedProduct[3] = `${updatedProduct[3].slice(0, maxNameLength)}...`;
  }
  return updatedProduct;
});

这样处理后,商品名称就会变成类似Batata 7 MM Corte Fino McC...的格式。

内容的提问来源于stack exchange,提问作者Victor Batista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:37:13