将非JSON格式的字符串转化为对象(对象嵌套对象)

前两天有个朋友提出了一个面试问题,一个对象嵌套对象的字符串要怎么转成对象,也就是将'{b:{c:{d:1,e:2},f:5},g:{h:6}}'去掉单引号,变成真正的对象,应该怎么做。

我第一时间的想法是直接用JSON.parse不就行了?后来发现直接使用会报错,于是才有了下文

let str = '{b:{c:{d:1,e:2},f:5},g:{h:6}}';
// 现将字符串进行分割
let d = /[a-z|0-9|_|-]*:/g  // 正则表达式子
let arr1 = str.match(d); // ['b:', 'c:', 'd:', 'e:', 'f:', 'g:', 'h:']

// 从嵌套对象的JSON转化可以发现,对象转化为JSON字符串的时候,key值是有带'""'的,因此我们是否可以给其添加双引号使其变成伪JSON字符串

// 这里添加双引号的第一个引号
arr1.forEach(item => {
    str = str.slice(0, str.indexOf(item)) + '"' + str.slice(str.indexOf(item))
})
// 此时我们发现是可以添加双引号的
// str = '{"b:{"c:{"d:1,"e:2},"f:5},"g:{"h:6}}'

let f = str.split(':');
// 定义一个空字符串存放结果

let h = ''

f.forEach(item => {
    h = h + item + '":'
})
// 去除结尾多余的'":'
h = h.slice(0, -2)

// 最后h的结果为'{"b":{"c":{"d":1,"e":2},"f":5},"g":{"h":6}}'
const obj = JSON.parse(h)
// obj = {b:{c:{d:1,e:2},f:5},g:{h:6}}

你可能感兴趣的:(js面试算法,json,javascript,前端,正则表达式,es6)