对象深拷贝/数组扁平化总结

问题

手写一遍, 方便记忆 ~

深拷贝
  1. 递归
	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))
  1. 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丢失
  1. 另外, 以前项目中用过 angular1.x , 其中有angular.copy方法, 同样可以深拷贝
	let obj5 = angular.copy(obj2)
扁平化
  1. 简单类型, 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)
  1. 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 ]
  1. 递归
	const flatt = (arr) => {
    let res = []
    arr.forEach(it => {
        if (Array.isArray(it)) {
            res = [...res, ...flatt(it)]
        } else {
            res = [...res, it]
        }
    })
    return res
}
  1. flat 最简单的方法, es6文档中有, 但网络上很少提及
 // flat参数可以规定扁平化几层, 默认1层
 let arr = [1, 5, [8, 8, 6, [6, 4, 3, {a:1, b:2}]]].flat(Infinity)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值