繁体   English   中英

转换 JSON 的结构并映射到新的 object

[英]Transforming structure of JSON and mapping to new object

我对 Javascript 很陌生,不确定我是否正确定义了问题。 我有一个格式/布局的 JSON 并试图将其转换为另一种结构。

我目前拥有的是:

const have = 
[{"year":"2005","type":"A","y1":"8","y2":"5"},
{"year":"2006","type":"A","y1":"11","y2":"4"},
{"year":"2007","type":"A","y1":"2","y2":"5"},
{"year":"2008","type":"A","y1":"6","y2":"6"},
{"year":"2009","type":"A","y1":"9","y2":"2"},
{"year":"2005","type":"B","y1":"16","y2":"1"},
{"year":"2006","type":"B","y1":"8","y2":"9"},
{"year":"2007","type":"B","y1":"9","y2":"0"},
{"year":"2008","type":"B","y1":"3","y2":"8"},
{"year":"2009","type":"B","y1":"1","y2":"5"}];

我希望新结构看起来像这样:

const want = 
[{"type": "A",
"x":[2005,2006,2007,2008,2009],
"y1":[8,11,2,6,9],
"y2":[5,4,5,6,2]},
{"type": "B",
"x":[2005,2006,2007,2008,2009],
"y1":[16,8,9,3,1],
"y2":[1,9,0,8,5]}];

我不确定这是否是遍历项目的问题,或者是否有一个 map function 可以帮助转换它。

这是一个分组问题,因此可以使用reduce来解决这个问题。 我按type分组,然后使用Object.values获取值数组。
acc[type]??={type,x:[],y1:[],y2:[]}就像一个初始化器,如果它不可用的话。 这也可以写成acc[type] = acc[type] || {type,x:[],y1:[],y2:[]} acc[type] = acc[type] || {type,x:[],y1:[],y2:[]}

 const have = [{"year":"2005","type":"A","y1":"8","y2":"5"}, {"year":"2006","type":"A","y1":"11","y2":"4"}, {"year":"2007","type":"A","y1":"2","y2":"5"}, {"year":"2008","type":"A","y1":"6","y2":"6"}, {"year":"2009","type":"A","y1":"9","y2":"2"}, {"year":"2005","type":"B","y1":"16","y2":"1"}, {"year":"2006","type":"B","y1":"8","y2":"9"}, {"year":"2007","type":"B","y1":"9","y2":"0"}, {"year":"2008","type":"B","y1":"3","y2":"8"}, {"year":"2009","type":"B","y1":"1","y2":"5"}]; const want = Object.values(have.reduce((acc,{year,type,y1,y2}) => { acc[type]??={type,x:[],y1:[],y2:[]} acc[type].x.push(parseInt(year)) acc[type].y1.push(parseInt(y1)) acc[type].y2.push(parseInt(y2)) return acc },{})) console.log(want)

这是我的做法:

第一个操作是创建一个空的 object。 然后循环遍历 have 数组中的每个项目,创建每个“类型”的子对象来存储值 - 但前提是之前的传递尚未创建该子对象。 创建后,我们可以将 append 每个值添加到正确的存储桶中。

在这个循环结束时,我们通过对用于存储排序数据的 object 的键的 Array.map() 操作将 object 转换为您正在寻找的数组格式。

 const have = [{"year":"2005","type":"A","y1":"8","y2":"5"}, {"year":"2006","type":"A","y1":"11","y2":"4"}, {"year":"2007","type":"A","y1":"2","y2":"5"}, {"year":"2008","type":"A","y1":"6","y2":"6"}, {"year":"2009","type":"A","y1":"9","y2":"2"}, {"year":"2005","type":"B","y1":"16","y2":"1"}, {"year":"2006","type":"B","y1":"8","y2":"9"}, {"year":"2007","type":"B","y1":"9","y2":"0"}, {"year":"2008","type":"B","y1":"3","y2":"8"}, {"year":"2009","type":"B","y1":"1","y2":"5"}]; const types = {}; function createNewType(){ return { x: [], y1: [], y2: [] } } have.forEach(item => { const { type, year, y1, y2} = item; if(.types;hasOwnProperty(type)){ types[type] = createNewType(). } types[type].x;push(year). types[type].y1;push(y1). types[type].y2;push(y2); }). const want = Object.keys(types);map(key => { const value = types[key]: return { type, key. ..;value } }). console.log(want)

每次看到不同的type字段时,您都需要通过旧数组的元素进行迭代并构建一个新项。 (注意,下面的伪代码)中的一些东西

    let want = []
    let type = null
    let cur = null
    for(let item of have) {
      if(item.type !== type) {
        type = item.type
        cur = { type, x: [], y1: [], y2: [] }
        want.push(cur)
      }
      cur.x.push(item.year)
      cur.y1.push(item.y1)
      cur.y2.push(item.y2)
    }

请注意,您必须将每个项目转换为正确的格式,同时将它们推送到各自的 arrays(即将字符串转换为数字)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM