正则处理数据中的函数?

在将excel转js对象保存为文件的过程中,遇到json中的函数处理问题,数据用JSON转换后发现函数会丢,所以就把函数整个作为字符串存储到对象内,然后导致另一个问题,对象中的函数字符串怎么转成对象保存到文件里

需要处理的json中的部分结构:

str = `
"a_c.b.d": {
  "aaa": [
    "T1",
    "T2"
  ],
  "O": "xxx",
  "D": {
    "a": "constant",
    "x": "value"
  },
  "funcKey": {
    "d": "variable",
    "func": "function fx() { return {} }"
  }
},
"a_c.b.x123": {
  "aaa": [
    "T1",
  ],
  "O": "desc",
  "D": {
    "a": "constant",
    "x": 1
  },
  "funcKey": {
    "d": "variable",
    "func": "function fx() { return {\"u\":\"\"} }"
  }
},
`

期待的结果:

var res = `
  'a_c.b.d': {
    aaa: ['T1', 'T2'],
    O: 'xxx',
    D: {
      a: 'constant',
      x: 'value',
    },
    funcKey: {
      func: function fx() {
        return {};
      },
    },
  },
  'a_c.b.x123': {
    aaa: ['T1'],
    O: 'desc',
    D: {
      a: 'constant',
      x: 1,
    },
    funcKey: {
      func: function fx() {
        return { u: '' };
      },
    },
  },
`

需要处理的有以下几点:
1.以"func"为key的字段值为函数字符串,需要转换成有缩进的函数字符串(写入js文件后识别为函数而不是字符串)
2.去除json中key的双引号,key中含有特殊字符无法去除的改成单引号
3.value中的双引号改成单引号

重点是1需要处理,暂时没找到好的解决办法,2和3已有解法,这里提出来是为了寻找一种统一的实现

function writeFile(string) {
    // TODO: 需要处理的位置
    fs.appendFileSync(string, 'output.js')
}

function parse(jsonString, outputDir) {
    const lines = JSON.stringify(jsonString, null, 2);
    const lines = lines.split(/\r?\n/);

    writeFile(`const Config = `);
    for(let line of lines) {
         writeFile(`${line}\n`);
    }

    writeFile('export default Config;\n')
}
阅读 2.1k
1 个回答
遇到json中的函数处理问题,数据用JSON转换后发现函数会丢,所以就把函数整个作为字符串存储到对象内

JSON.parse 在结项function 正则 map等数据结构时会丢失。可以试试 deep clone 的方式,深复制的解决方案很多,比如lodash的 cloneDeep 方法。


如果还是按照目前思路的话,尝试下 new Function(string) 解决,需要针对function() {} 和 () => {} 做下处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题