问题
手写一遍, 方便记忆 ~
深拷贝
- 递归
const deepClone = (obj) => {
let res = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === "object") {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
res[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key]
}
}
}
return res
}
let obj = { a: 1, b: { w: 4 } }
console.log(deepClone(obj))
- JSON.stringify() / JSON.parse()
let obj = { a: 1, b: { w: 4 } }
let obj1 = JSON.parse(JSON.stringify(obj))
console.log(obj1)
// 此方法问题在于, 若属性的值为undefined, 会造成属性丢失
let obj2 = { a: 1, b: { w: 4, k: undefined } }
let obj3 = JSON.parse(JSON.stringify(obj2))
console.log(obj3) // { a: 1, b: { w: 4 } } , //k丢失
- 另外, 以前项目中用过 angular1.x , 其中有angular.copy方法, 同样可以深拷贝
let obj5 = angular.copy(obj2)
扁平化
- 简单类型, toString() / join()
// 只适用于每一项类型相同, 且均为简单类型
let arr = [1,5,[8,8,6,[6,4,3]]]
let arr1 = arr.toString().split(',').map(Number)
let arr2 = arr.join(',').split(',').map(Number)
- reduce
const flatten = (arr) => {
return arr.reduce((cur, next) => {
return cur.concat(Array.isArray(next) ? flatten(next) : next)
}, [])
}
console.log(flatten([1, 5, [8, 8, 6, [6, 4, 3]]]))
// [ 1, 5, 8, 8, 6, 6, 4, 3 ]
- 递归
const flatt = (arr) => {
let res = []
arr.forEach(it => {
if (Array.isArray(it)) {
res = [...res, ...flatt(it)]
} else {
res = [...res, it]
}
})
return res
}
- flat 最简单的方法, es6文档中有, 但网络上很少提及
// flat参数可以规定扁平化几层, 默认1层
let arr = [1, 5, [8, 8, 6, [6, 4, 3, {a:1, b:2}]]].flat(Infinity)