javascript - 从数据库记录生成递归 JSON

标签 javascript json recursion

我已经在做某事好几天了,但无法弄清楚。我有一个 数据库表(带有虚拟数据)如下所示:

enter image description here

基于keyvalue我想生成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"
        }
    ]
}]

最佳答案

您可以使用递归函数而不是一级map()功能。

首先,用 field_id === null 过滤掉值获取根元素。

然后通过使用 fields.filter(field => field.field_id === item.id) 进行过滤来获取其子级并将该函数应用于每个 child 。

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

希望这有帮助。

关于javascript - 从数据库记录生成递归 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61054581/

相关文章:

javascript - 与浮点运算一致的整数除法

json - npm run build > 不在 NestJs 项目中创建 dist 文件夹

java - 使用递归反转列表的元素

java - 递归期间堆栈溢出

javascript逻辑运算符作为函数中的参数

javascript - 为什么要在删除之前检查元素/属性?

mysql - Node.js 用 mysql 编写 api 代码(sequelize)

c# - 执行 FloodFill 的不同方法

javascript - 突出显示事件(打开)链接

javascript - 在jsf中使用json将数据从bean发送到javascript