首页 > 解决方案 > 在 JavaScript 中重构 JSON?

问题描述

我从服务器收到一个 JSON,比如 ExampleA,但我需要它像 ExampleB,我尝试了很多东西,比如拼接、推送、传播运算符,但无法实现我的目标,似乎我过度嵌套了结构。示例A:

[
  {
    "year": 2017,
    "Setor": {
      "6": {
        "ID Sector": 7,
        "revenue": 5555555
      },
      "7": {
        "ID Sector": 10,
        "revenue": 5555555
      }
    }
  },
  {
    "year": 2018,
    "Setor": {
      "8": {
        "ID Sector": 7,
        "revenue": 7777777
      },
      "9": {
        "ID Sector": 10,
        "revenue": 7777777
      }
    }
  }
]

示例B:

 [
  {
    "7": 5555555,
    "year": 2017,
    "10": 5555555,
  },
  {
    "7": 7777777,
    "year": 2018,
    "10":7777777
  }
]

如您所见,我想要一个 JSON,其中每个数组都有一个“年份”,扇区的 id 作为“索引”,其值作为收入。

编辑:抱歉没有包括我的代码,这是我尝试的最后一件事:

        var Obj=[];
        this.data.items.forEach((value,index,array)=>{
            var data = value.data;
            var arraySectorsData =[];
            var actualYear = {year:data.year};
            for(var sector in data.Setor){
                var revenue = {[data.Setor[sector]['ID Sector']]:data.Setor[sector].revenue};
                arraySectorsData.splice(0, 0, revenue);
            }
            arraySectorsData.splice(0, 0, actualYear);
            Obj[index]=[...arraySetoresDados];
        });

这就是我得到的:

[
  [
    {
      "year": 2017
    },
    {
      "7": 5555555
    },
    {
      "10": 5555555
    }
  ],
  [
    {
      "year": 2018
    },
    {
      "7": 7777777
    },
    {
      "10": 7777777
    }
  ]
]

标签: javascriptjson

解决方案


一种解决方案是使用Array.map()将元素映射到新对象。为了创建新对象,我们使用Object.assign()Object.values()Array.reduce()

const input = [
  {
    "year": 2017,
    "Setor": {
      "6": {"ID Sector": 7, "revenue": 5555555},
      "7": {"ID Sector": 10, "revenue": 5555555}
    }
  },
  {
    "year": 2018,
    "Setor": {
      "8": {"ID Sector": 7, "revenue": 7777777},
      "9": {"ID Sector": 10, "revenue": 7777777}
    }
  }
];

let res = input.map(
    ({year, Setor}) => Object.assign(
        {year},
        Object.values(Setor).reduce(
            (acc, o) => (acc[[o["ID Sector"]]] = o.revenue, acc),
            {}
        )
    )
);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}


推荐阅读