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
}


浙公网安备 33010602011771号