前端开发之:对象的思考

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. 代码简洁,易处理
上一篇
下一篇