object 对象的巧用 浅拷贝,同原的利用
循环的时间复杂度远远高于,不循环,所以可以不用循环尽量不用。但是在开发中很多的循环是不可避免的,这时候就可以考虑来构造一个对象替代循环,通过对象属性直接查找目标,可以降低时间复杂度O(n),提高性能。 尤其是在数组嵌套的数组中等等。 举个栗子:
arr: [{
id: '1',
text:'一级父数组',
child: [{
id: '11',
text: '二级子数组'
},{
id: '12',
text: '二级子数组',
child2:[{
id: '121',
text: '三级子数组'
}]
}],
}]
平时遇到这种tree型的数组,想要获取并处理内部child以及child的child,子子孙孙等等的数据时候,需要嵌套很多层的循环,这时候性能就明显有所下降。此时可以针对不同的child构建一个child对象(可以根据不同的情况构造对象属性,此处我一般用id字符串来构造,id具有唯一性)。
let childObj = {}
arr[0].child.forEach((c)=>{
childObj[c.id]=c
})
经过循环此时的childObj中存储的是arr[0]的child
中所有对象的地址值,此处利用对数组和对象的浅拷贝,childObj中的所有属性值都是child中对象的地址,当通过childObj[key]
修改对象中的属性值时,arr中相对应的对象的属性值也发生改变,因为浅拷贝,同原。 这样每次处理数组中的对象时无需循环查找再修改,只需利用构造属性key直接从childObj中获取到(原生的obj对象方法是同过一些低级语言c、c++等等实现会快很多)进行修改。 #### 关键点总结:
1.需要多次循环的处理数据
2.对象数组具有唯一值的属性值作为构造对象的属性
3.对数组对象进行浅拷贝构造对象,此处利用的是浅拷贝同原的原理
优点:
1. 利用很少的存储(对象的地址)来换取运行性能的大幅提升。
2. 代码简洁,易处理