猿问

从数据库记录生成递归 JSON

我现在正在研究一些东西,但无法弄清楚。我有一个看起来像这样的数据库表(带有虚拟数据):

基于key和value我要生成json。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);


但这显然行不通。我想我需要某种递归函数?


预期输出:


[{

    "key1": [{

            "key2": [{

                "key3": "value3"

            }]

        },

        {

            "key4": "value4"

        }

    ]

}]


慕村9548890
浏览 100回答 2
2回答

函数式编程

您可以使用递归函数而不是一级map()函数。首先,使用 过滤掉值field_id === null以获取根元素。然后通过过滤获得它的孩子fields.filter(field => field.field_id === item.id)并将函数应用于每个孩子。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; }
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答