[英]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.