当前位置: 首页 > 知识库问答 >
问题:

javascript - js递归如何生成该数据的预览json格式?

单于海荣
2023-11-23

需求就是通过json生成json,简化后的格式如下,如何通过递归的方式生成这些数据表示的最终格式?求教

//这个是各个类型生成的默认值const defaultVal = {    string:"默认值",    int:1,    float:0.1,    double:10.34,    boolean:false,    array:null}
//这个是json待转化的[    {        "type": "object",        "propertyName": "user",        "children": [            {                "type": "string",                "propertyName": "name",                "children": null            },            {                "type": "int",                "propertyName": "age",                "children": null,                            },            {                "type": "array",                "propertyName": "data",                "children": [                    {                        "type": "object",                        "name": "name",                        "children": null                    }                ]            }        ]    }]
//上述转化结果为:{    name:'默认值',    age:1,    data:[{}]}

共有3个答案

燕砚文
2023-11-23
const parseJson = (json: any) => {    if (Array.isArray(json)) {        const result = [] as any;        for (const item of json) {            if (item.propertyType === 'object') {                const obj = {} as any;                if (item.children) {                    for (const child of item.children) {                        if (child.propertyName) {                            obj[child.propertyName] = parseJson(child);                        }                    }                }                result.push(obj);            } else if (item.propertyType === 'array') {                const arr = parseJson(item.children);                if (arr && arr.length > 0) {                    result.push(arr);                } else {                    result.push(defaultVal[item.propertyType]);                }            } else {                result.push(defaultVal[item.propertyType]);            }        }        return result && result.length ? result : [];    } else if (json.propertyType === 'object') {        const obj = {} as any;        for (const child of json.children) {            if (child.propertyName) {                obj[child.propertyName] = parseJson(child);            }        }        return obj;    } else if (json.propertyType === 'array') {        return parseJson(json.children);    } else {        return defaultVal[json.propertyType];    }}

一种实现方式,试了下还可以,不知道有没有更好的方法

宋臻
2023-11-23

根据判断数据类型,下面简单的判断力一下,针对float等再详细判断

let data = {  name: "张三",  age: 15,  i: 19.8,  score: [{ english: 89.5, chinese: 97.0 }],};let list = this.getData(data, []);console.log(list)
getData(data, list) {  let obj = {};  for (let key in data) {    obj = {      type: typeof data[key],      propertyName: key,      children: null,    };    if (typeof data[key] !== "object") {      // 不是对象和数组      list.push(obj);    } else {      obj.children = [];      if (data[key] instanceof Array) {        data[key].forEach((item) => {          obj.children = this.getData(item,obj.children);        });      }      list.push(obj);    }  }  return list},``
马博学
2023-11-23
function toData(rule, defVal, init) {    const copy = val => JSON.parse(JSON.stringify(val));    const initial = init ?? copy(defVal[rule.type]);    return rule.children ? rule.children.reduce((res, v) => {      if(Array.isArray(res)) res.push(toData(v, defVal));      else if({}.toString.call(res) == '[object Object]') toData(v, defVal, res[v.propertyName] = copy(defVal[v.type]))      return res;  }, initial) : initial;}toData(  {    "type": "object",    "propertyName": "user",    "children": [      {        "type": "string",        "propertyName": "name",        "children": null      },      {        "type": "int",        "propertyName": "age",        "children": null,      },      {        "type": "array",        "propertyName": "data",        "children": [          {            "type": "object",            "name": "name",            "children": null          }        ]      }    ]  },  {    string:"默认值",    int:1,    float:0.1,    double:10.34,    boolean:false,    array:[],    object: {},  })
 类似资料:
  • 我正在尝试创建一个递归函数,该函数将生成项的嵌套结构。此文件中的每个项都有一个指向其子项的指针和一个停止值,如您可以在下面看到的: 这个递归函数应该获得一个开始索引,它将根据该索引构建树,并返回一个嵌套的字典,如下所示:

  • 我想通过js完成对表格进行插入数据。该如何处理。例如有个json数据,格式如下: 最终表格是三行4列,第4列数据是根据每行第3列的数据调用一个方法,然后输出到该行中的第四列中。

  • 上边格式如何转换为以下格式

  • js怎么根据一个视频的在线url生成一个视频预览图? 相当于要获取该视频的第一秒或者第一帧的图片。

  • 问题内容: 我有一个扁平的json文件结构,例如: 我想要的是一个嵌套的文件结构,如: 对于应该深入多少层没有限制。我当前拥有的最大值是30。一个节点可以拥有的子级数量没有限制。例如。根节点将其余所有节点作为其子节点。 到现在为止我一直在尝试什么? 阅读有关d3.nest()的信息,以及它如何能够嵌套但并不完美。 https://groups.google.com/forum/?fromgroup

  • 问题内容: 我正在寻找一个函数,该函数需要一个页面/类别的数组(来自平面数据库结果),并根据父ID生成一个嵌套的页面/类别的数组。我想递归地执行此操作,以便可以进行任何级别的嵌套。 例如:我在一个查询中获取所有页面,这就是数据库表的样子 这是我要最终在视图文件中处理的数组: 我已经看过并尝试过几乎遇到的所有解决方案(Stack Overflow上有很多解决方案,但是没有运气得到足够通用的东西同时适