簡體   English   中英

從數據庫記錄生成遞歸 JSON

[英]Generate recursive JSON from db records

我現在正在研究一些東西,但無法弄清楚。 我有一個看起來像這樣的數據庫表(帶有虛擬數據):

在此處輸入圖像描述

基於我要生成 json 的keyvalue 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM