lodash常用的一个数据处理工具库,与原生函数功能类似,只是被封装过后,处理数据更友好。
最近项目踩到一个坑--
前提条件:有一个对象数组,并且给对象中还有值为array和object的情况。
想要遍历改数组data,然后对里面的对象追个处理,希望结果:得到的数组中每个对象的有被正确处理过。
1、map:data.map((item) => {doSomething(item); return item}) 此时data会变成想要的处理过后的data,但这仅仅是因为item都是对象,是一种引用类型,如果item是基础数据类型话,那就挂了,所以为了保险起见,map之后用变量接收它的返回值,const targetData = data.map((item) => {doSomething(item); return item})。拿到的targetData一定是想要的处理后的数据。map一定是要在回调函数里有return的,否则targetData就是个类似[undefined, undefined]这样的数组,data当然还是以前的data咯。
2、foreach: data.foreach((item) => {doSomething(item))此时data也会变成想要的处理过后的data,但这也是仅仅因为item都是对象,是一种引用类型,如果item是基础数据类型话,那这个foreach就白跑了,它的回调还不接收return,相当于不会有任何的变化。比map还要白,至少人有返回值,还能抢救一下。
以上解答了一下两者的区别,以及坑的填补方法,接下来顺带测试了一下,感觉一直有七一的几个函数。
lodash函数_.assign和_.merge这两个的区别,大概是当合并的数据有相同的key对应的值是引用数据类型时的处理方式,前者是后面的覆盖前面的,后者是合并属性。
但这里要说的不是这点,意外的发现。如果用这两个函数来新创建一个对象的时候
assign竟然是个浅拷贝。不过查到原来的Object.assign也是个浅拷贝,也不能怪人家咯。const target1 = _.assign({}, source1) 如果源对象某个属性的值是引用数据类型时,那么目标对象拷贝得到的是这个对象的引用,即如果scouce1对象中有值为array或者object的数据,target1改变后,source1依然会受到改变。这点其实跟es6的(...)操作符类似,const target12 ={ ...source1} 它其实也是个浅拷贝,被坑好多次。。。
但merge却实现了一个深拷贝,也算是找到了一个能用顺手的函数了。不过取个巧用_.omit貌似也能拿到一个深拷贝的对象。
暂时想到的就这些了,这基本是因为要处理一个对象数组,对象中又有值为引用类型的数据时,引发的一系列数据处理的问题,小心为妙呀~