数组、对象扁平化主要运用的有两个知识点,一个是数据类型的判断,另一个则是递归的运用。
instanceof:判断数据类型
obj instanceof Object //判断对象
arr.instanceof Array //判断数组
先来一段网上copy下来的代码
let obj = {
a:5,
b:{c:2,d:['ac',{d:5},9]},
ce:{qa:561,ceq:'ceq',bing:['ce','ceq',{ceae:'cq'}]},
f:56,
g:['cea','ceg'],
z:null,
qc:'ceq'
}
function fl(obj){
const ans = {};
inner(obj,null);
function inner(o,prev){
for(let key in o){
if(o[key] instanceof Object){
if(prev === null){
inner(o[key],key);
}else{
inner(o[key],prev + '.' + key);
}
}else{
if(prev === null){
ans[key] = o[key]
}else{
ans[prev + '.' + key] = o[key];
}
}
}
}
return ans;
}
instanceof 的做用就是判断当前是否是对象。
而在此中,首先是判断每一个小对象中的值是否也是对象。所以在这儿用的是instanceof。如果说小对象中不再有对象(也就是最后一层了)那么就它就直接输出。
而如果在小对象里面还有对象,那它就来一次递归,再次用链值对的方法。
…
如果是数组,也是类似。
let arr = [5,6,3,[23,54,45,[56,45465,['ce','fec']]],['CE',{ceg:'cefg'}]];
function arrFormat(arr){
var res = [];
arr.forEach((item,index,arr)=>{
if(item instanceof Array){
//res = res.concat(arrFormat(item));
//或者也可以这样写(说白了就是合并数组)
let f = arrFormat(item)
res = [...res,...f]
}else{
res.push(item)
}
})
return res;
}
let a = arrFormat(arr);
console.log(a);
对于数组的扁平化,我们也可以用ES6它内置的函数来处理。
//flat(Infinity) 也可以来处理数组的扁平化
let arr = [
2,3,5,
['a','c',[6,9,0,['q','w','e']]]
]
let r = arr.flat(Infinity);
console.log(r)
总结起来,不管是对象扁平化还是数组的扁平化,都是以大对象/数组拿来做遍历,遍历它里面的小元素。直到它的最后一级。
注:代码来原于网上的搞抄,而讲解只是自己的理解所写下来的。代码部份还请原作者见谅