为了账号安全,请及时绑定邮箱和手机立即绑定

从数据库记录生成递归 JSON

从数据库记录生成递归 JSON

慕村9548890 2022-06-16 16:41:05
我现在正在研究一些东西,但无法弄清楚。我有一个看起来像这样的数据库表(带有虚拟数据):基于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"        }    ]}]
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

您可以使用递归函数而不是一级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);


查看完整回答
反对 回复 2022-06-16
?
慕森卡

TA贡献1806条经验 获得超8个赞

您可以采用单循环方法并生成一棵树。


该解决方案采用节点到父节点和父节点到节点之间的两个方向。


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; }


查看完整回答
反对 回复 2022-06-16
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信