js多层嵌套的对象扁平化处理

对象Object

将多层嵌套的Object做扁平化处理

例如:将看上去很恶心的object

let obj = {
  a:1,
  b:{
    b1:3,
    b2:[{
        b21:1,
        b22:{
          b221:2,
          b222:[1,2,3],
          b223:{}
        }
      },
      22
    ]
  },
  c:[1,2,3]
}

处理成

{
  a: 1,
  b.b1: 3,
  b.b2[0].b21: 1,
  b.b2[0].b22.b221: 2,
  b.b2[0].b22.b222[0]: 1,
  b.b2[0].b22.b222[1]: 2,
  b.b2[0].b22.b222[2]: 3,
  b.b2[0].b22.b223: {},
  b.b2[1]: 22,
  c[0]: 1,
  c[1]: 2,
  c[2]: 3
}

方法一: 递归

递归是最容易想到的办法也是常见的处理多层循环的办法
分析:
1.首先如果是 基础数据类型 的话直接进行赋值就行 ==》 扩展1: js基础数据类型有哪些? 扩展2: 如何判断是不是基础数据类型?
2. 如果是个 数组 要考虑是否为空数组,空数组直接赋值[], 如果不是就遍历递归调用自定义的flatten方法; ==》 扩展3: 判断是否为数组的方法有哪些?
3. 如果是个Object对象,一样先考虑是不是空对象,空Object直接赋值{},否则遍历递归调用自定义的flatten方法 ==》 扩展4: 判断是否为Object对象的方法有哪些?
==> 扩展5:Object的遍历方式有哪几种?

function flattenObj (paramObj) {
  let result = {}
  function flatten(key, val) {
    if (Object(val) !== val) {     //通过该方法可以判断是不是基础数据类型
      if (key) result[key] = val
    } else if (Object.prototype.toString.call(val) === '[object Array]') {  //是个数组
      if (val.length === 0) {
        result[key] = []
      } else {
        val.map((item, index) => {
          flatten(`${key}[${index}]`, item)
        })
      }
    } else {
      if (Object.keys(val).length === 0 && key) result[key] = {}
      for (let _key in val) {
        flatten(key ? `${key}.${_key}`: _key, val[_key])
      }
    }
  }
  flatten('', paramObj)
  return result
}

image



** 文中提到的扩展的知识点,旨在提示对于知识点的巩固和扩展,后面会以博客形式统一整理输出;


posted @ 2023-02-10 17:27  叶静逍  阅读(542)  评论(0)    收藏  举报