MergeObject 对象合并

简介

日常开发当中经常遇到将两个对象合并为一个对象,保留相同值得属性,替换不同值得属性;同时还会遇到浅层拷贝,深度拷贝的问题。

axClone

该函数是深度拷贝函数,返回一个一模一样的对象。

完整写法:axClone(obj),参数说明如下:

  • obj:必填项,格式如{name:'china'}。

举例:axClone({name:'china'}),该例子将根据原对象拷贝为一个除了物理地址不同其他完全一样的新对象。

axMerge

该函数是递归合并函数,如果跟原对象不一样则替换,在原对象基础上修改扩充,最终返回修改后的原对象,物理地址不变。

完整写法:axMerge(target, source,options),参数说明如下:

  • target:必填,原始对象,格式如{name:'china',age:5000}
  • source:必填,参与替换的对象,格式同target
  • options:选填,参数支持三个属性:
    • arrAppend:遇到数组是push还是替换,默认false,即替换。如果选择true那么将在数组后面追加数组项
    • clone:函数返回新对象还是返回target对象,默认false,即返回target。如果选择true那么将返回新对象,target不会被改变
    • attrAppend:被扩展的对象如果没有属性但是source却有,是保持不变还是追加,默认false,即不追加。如果选择true那么将追加新属性

举例:axMerge({name:'china',age:5000}, {age:6000}),该例子最终返回{name:'china',age:6000}

options如果为空,那么如果被合并的对象是一个数组,那么将直接覆盖,不再循环数组属性(数组的属性是index:0、1、2、3...);同时函数返回target对象

axDataset

该函数可获得data-*的属性值并转为对象,与其他对象进行合并。

完整写法:axDataset(elem, obj),参数说明如下:

  • elem:必填,可以填"#id"、".className"、"div"等原生选择器以及Dom对象。
  • obj:必填,原始对象,格式如{name:'china',age:5000}

举例:axDataset('#demo', {name:'china',age:5000}),该例子中如果#demo节点有data-age="6000"属性,那么将返回{name:'china',age:6000}。

仅支持data-*属性的三级结构:data-country='',data-country-province=''和data-country-province-downtown='';也就是最多可转成三层属性对象:{country:{province:{downtown:''}}}

axExtend

该函数集合了以上三个函数,合并后返回原始对象。

完整写法:axExtend(dft, user, elem),可简写axExtend(dft, user),参数说明如下:

  • dft:必填,原始对象,格式如{name:'china',age:5000}
  • user:必填,参与替换的对象,格式同dft
  • elem:选填,可以填"#id"、".className"、"div"等原生选择器以及Dom对象。填写后将获取该Dom元素的data-*属性来合并对象。

举例:axExtend({name:'china',age:5000,area:960},{age:6000},'#demo'),该例子中如果#demo节点有data-area="970"属性,那么将返回{name:'china',age:6000,area:970}。