![](/img/trans.png)
[英]convert xml to json after retrieving records from db using angularjs
[英]Generate recursive JSON from db records
我現在正在研究一些東西,但無法弄清楚。 我有一個看起來像這樣的數據庫表(帶有虛擬數據):
基於我要生成 json 的key
和value
。 field_id
是 json 結構中的父級。 但是如何在 javascript 中生成這個結構?
我已經嘗試過了:
let fields = [ { id: 1, field_id: null, key: 'key1', value: 'value1'}, { id: 2, field_id: 1, key: 'key2', value: 'value2'}, { id: 3, field_id: 2, key: 'key3', value: 'value3'}, { id: 4, field_id: 1, key: 'key4', value: 'value4'} ]; let result = []; fields.map(({key, value, id}) => { let obj = {}; obj[key] = value fields.forEach((f) => { if(f.field_id == id) { let obj2 = {}; obj2[f.key] = f.value obj = {...obj, ...obj2} } }); result.push(obj); }); console.log(result);
但這顯然行不通。 我想我需要某種遞歸 function?
預期 output:
[{
"key1": [{
"key2": [{
"key3": "value3"
}]
},
{
"key4": "value4"
}
]
}]
您可以使用遞歸function 而不是一級map()
function。
首先,過濾掉field_id === null
的值以獲得根元素。
然后通過使用fields.filter(field => field.field_id === item.id)
過濾來獲取它的孩子,並將 function 應用於每個孩子。
let fields = [ { id: 1, field_id: null, key: 'key1', value: 'value1'}, { id: 2, field_id: 1, key: 'key2', value: 'value2'}, { id: 3, field_id: 2, key: 'key3', value: 'value3'}, { id: 4, field_id: 1, key: 'key4', value: 'value4'} ]; const getNested = (item) => { const children = fields.filter(field => field.field_id === item.id); return { [item.key]: children.length === 0? item.value: children.map(field => getNested(field)) } } const nestedJSON = fields.filter(field => field.field_id === null).map(field => getNested(field)) console.log(nestedJSON);
希望這可以幫助。
您可以采用單循環方法並生成一棵樹。
該解決方案采用節點到父節點和父節點到節點之間的兩個方向。
let fields = [{ id: 1, field_id: null, key: 'key1', value: null }, { id: 2, field_id: 1, key: 'key2', value: null }, { id: 3, field_id: 2, key: 'key3', value: 'value3' }, { id: 4, field_id: 1, key: 'key4', value: 'value4' }], tree = function (data, root) { var t = { keys: {} }; data.forEach(({ id, field_id, key, value }) => { t[id] = t[id] || {}; t[id][key] = value === null? []: value; t.keys[id] = key; t[field_id] = t[field_id] || {}; let k = t.keys[field_id]; t[field_id][k] = t[field_id][k] || []; t[field_id][k].push(t[id]); }); return t[root].undefined; }(fields, null); console.log(tree);
.as-console-wrapper { max-height: 100%;important: top; 0; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.