总思路:使用递归对对象的每个元素进行判断,如果是原始类型就直接输出,如果是引用类型就继续对该元素递归进行判断,一直到最后一个原始类型的元素。
先看一下多维数组的展开
let arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
let result = [];
function expand(arr) {
arr.forEach((item) => {
if (item instanceof Array) {
//如果是数组就递归
expand(item);
} else {
//是普通元素就输出
result.push(item);
}
});
}
expand(arr);
console.log(result);//[1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
再来看对象展开
function process(key, value) {
if (Object(value) !== value) { //原始数据直接存
if (key) {
result[key] = value
}
}
else if (Array.isArray(value)) { //数组==》继续递归
value.forEach((item, ind) => {
process(`${key}[${ind}]`, item)
})
if (value.length === 0) {
result[key] = [];
}
}
else { //对象==》继续递归
let keys = Object.keys(value)
keys.forEach((item) => {
process(key ? `${key}.${item}` : `${item}`, value[item])
})
}
}