问答题931/1593实现一个对象的 flatten 方法

实现以下转换:

1const obj = { 2 a: { 3 b: 1, 4 c: 2, 5 d: { 6 e: 5 7 } 8 }, 9 b: [1, 3, {a: 2, b: 3}], 10 c: 3 11}

flatten(obj){} 结果返回如下

1// { 2// 'a.b': 1, 3// 'a.c': 2, 4// 'a.d.e': 5, 5// 'b[0]': 1, 6// 'b[1]': 3, 7// 'b[2].a': 2, 8// 'b[2].b': 3 9// c: 3 10// }
难度:
2021-11-17 创建

参考答案:

从结果入手,可以看出需要对象进行遍历,把里面的属性值依次输出。

核心方法体就是:传入对象的 key 值和 value,对 value 再进行递归遍历。

而 js 的数据类型可以分为基础数据类型引用数据类型,对于题目而言,基础数据类型无需再进行深层次遍历,引用数据类型需要再次进行递归。

1function flat(obj, key = "", res = {}, isArray = false) { 2 for (let [k, v] of Object.entries(obj)) { 3 if (Array.isArray(v)) { 4 let tmp = isArray ? key + "[" + k + "]" : key + k 5 flat(v, tmp, res, true) 6 } else if (typeof v === "object") { 7 let tmp = isArray ? key + "[" + k + "]." : key + k + "." 8 flat(v, tmp, res) 9 } else { 10 let tmp = isArray ? key + "[" + k + "]" : key + k 11 res[tmp] = v 12 } 13 } 14 return res 15}

还有一种写法更加容易理解:

1function objectFlat(obj = ''){ 2 const res = {} 3 function flat(item , preKey = ''){ 4 Object.entries(item).forEach(([key,value]) => { 5 let newKey = key 6 if (Array.isArray(item)){ 7 // console.log('是数组') 8 newKey = preKey ? `${preKey}[${key}]` : key 9 }else{ 10 newKey = preKey ? `${preKey}.${key}` : key 11 } 12 if (value && typeof value === 'object'){ 13 flat(value , newKey) 14 }else{ 15 res[newKey] = value 16 } 17 }) 18 } 19 flat(obj) 20 return res 21} 22 23const source = { a: { b: { c: 1, d: 2 }, e: 3 }, f: { g: 2 } } 24console.log(objectFlat(source)); 25const obj = { 26 a: 1, 27 b: [1, 2, { c: true }], 28 c: { e: 2, f: 3 }, 29 g: null, 30}; 31console.log(objectFlat(obj));

最近更新时间:2021-11-17

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!