簡體   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