首页 新闻 搜索 专区 学院

jQuery.merge()与concat有什么区别吗

0
悬赏园豆:100 [已解决问题] 解决于 2013-09-03 10:48

今天维护了下个自定义jquery组件   遇到一个问题 不知道怎么回事 问题如下:

demo 部分代码

自定义组件中 有这样  initValue : []的一个数组变量 有个方法 value(s) 用于赋值  //s也是数组类型        this.options.initValue是取当前组件的initValue属性(这样获得值 会和组件绑定)

方式一:jQuery.merge(this.options.initValue,s);

方式二:this.options.initValue=this.options.initValue.concat(s);

创建两个组件时 方式一创建的第一个组件的initValue会影响到方式一创建的第二个组件

方式二 则不会影响;

问题补充:

可能我的问题 问的有点问题,您没理解对。

我的意思是这两个方式都好使 只不过有这样一个问题 有个类有initValue属性 initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12"]

当创建第二个对象时 操作与第一个一样  initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12","11","12"] 这是我的问题原意??

cattsoft的主页 cattsoft | 初学一级 | 园豆:116
提问于:2013-09-02 16:05
< >
分享
最佳答案
2

concat :如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

this.options.initValue=this.options.initValue.concat(s);

楼主错应该是将一个数组传进去了、

 

jQuery.merge(first,second)

合并两个数组

返回的结果会修改第一个数组的内容——第一个数组的元素后面跟着第二个数组的元素。

这个接受的是两个数组、

收获园豆:100
Beyond-bit | 老鸟四级 |园豆:2820 | 2013-09-02 16:34

可能我的问题 问的有点问题,您没理解对。

我的意思是这两个方式都好使 只不过有这样一个问题 有个类有initValue属性 initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12"]

当创建第二个对象时 操作与第一个一样  initValue=[]; 当传入s时 s=["11","12"] 用concat后 initValue=["11","12"],用Jquery。merge后initValue=["11","12","11","12"] 这是我的问题原意??

cattsoft | 园豆:116 (初学一级) | 2013-09-03 09:12

@cattsoft: 昂, 你的意思,第一个没问题。当创建第二个的时候出问题了?变成:initValue=["11","12","11","12"] 了?

你的数组是不是全局变量?能否贴上你的代码?

Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-03 09:48

@Beyond-bit: 大体格式如下:

(function($,undefined){

$.widget("XXX.checkcombobox"{
    options:{
      XXXXXXX,
      initValue : '', //初始值
      XXXXXXX,
      change:null //回调函数
      },

      _create:function(){

       XXXXXXXX;

      },

      _destroy:function(){

        XXXXXXX;

      },

      value:function(s){

        var self=this;//this 是当前对象

        self.options.initValue=self.options.initValue.concat(s);

      }

});
})(jQuery);

   我觉得应该和这个全局的没关系 因为两种方式都是把数组组合后赋值到initValue中 全局的话应该都有问题才是 。

cattsoft | 园豆:116 (初学一级) | 2013-09-03 10:34

找到问题的答案了 我的理解是   是merge的本身的机制 它会开辟一块小小内存 再次merge时 会在前一次的值上追加值赋给新的数组 这就是为什么 出现第二个对象多了值得原因

cattsoft | 园豆:116 (初学一级) | 2013-09-03 10:44

@cattsoft: 对对,就是,我刚刚特地测试了一下发现merge缺陷、按照这样的逻辑下去,merge过的数组都会存在内存之中,即使闭包了,还是不回收,好可怕、算是jquery的一个设计缺陷嘛?

Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-03 11:27

@Beyond-bit: 我还是对merge有很大疑问  看了下Jquery源码 发现不可能是merge的问题 因为他的代码太简单了 只做个小小连接数组,我原来把initValue格式初始化initValue=[];因为需求要更改要求支持字符串,

我改成initValue=' '; 再次测试merge似乎那个倒霉的问题又没了 正在求证中。。。。。。

cattsoft | 园豆:116 (初学一级) | 2013-09-03 17:02

@cattsoft: 我改成initValue=' '; ?你改这个相当于把你的参数default 了,而merge 下次执行了,再次执行的时候还是会叠加,后来我想了想,是不是jquery本来定义merge的函数的时候就是叠加用的、而并不是像我们理想的下次叠加又会重新、

像你这种特殊的需求,应该自己定义一个javascript函数来实现,并非jquery内置函数就能解决你的问题、你说呢?

Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-03 17:13

@Beyond-bit: 我改成initValue=' ';主要是initValue既支持字符串类型 也支持数组类型而已

原来initValue=[];只支持 数组类型 就改个[]变成 ''  merge就好使了   很令人费解。

不管如何解决了就好 下次在遇到注意一下就好了 个人认为不是merge的问题 您可以看下jquery源码 

cattsoft | 园豆:116 (初学一级) | 2013-09-03 17:36

@cattsoft: 刚刚,我通过new了两个对象来测试,发现依旧会叠加。两个对象,第一个没问题。当第二个对象传两个数组的时候,alert出来的值,竟然里面包含第一个对象的数组值、

Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-03 17:40

@Beyond-bit: 代码能贴出来下不,我看看 是不是merge的问题。

cattsoft | 园豆:116 (初学一级) | 2013-09-03 17:44

@cattsoft: 

    <script>
    //第一次通过变量测试
    $(document).ready(function(){
    
            var a = ["a","b"];
            var b = ["c","d"];
            var d = ["d","e"];
            var temp =test(a,b);
            alert(temp);
            alert(test(a,d));
    
    })
    
    function test(a,b){
        return $.merge(a,b);
    }


    //第二次通过实例化对象测试    
    var testM ={
        fu:function(a,b){
            return $.merge(a,b);
        }
    }
    
    var a = ["a","b"];
    var b = ["c","d"];
    var d = ["d","e"];
    
    //Obj1
    var test1= new testM();
    //alert(test1.fu(a,b));
    alert("test1----------"+test1.fu(a,d));
    //Obj2
    var test2= new testM();
    alert("test2----------"+test2.fu(a,d));
    </script>

jquery需要的库你引用一下、如假包换测试、
Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-03 17:49

@Beyond-bit: 确实  用merge有问题 用concat没有问题 

merge(a,b) 实际是把b挂到a之后 即a变成a=a+b     b没变

a。concat(b) 创建一个新的数组c 存a+b c=a+b  这也是他们的区别

估计创建新对象时 没有还原数组a造成merge的问题  而concat的数组a没变 所以不存在这种问题

谢谢你这么认真地回答 真心想交个朋友 互相交流互相帮助   qq:1435648802 

cattsoft | 园豆:116 (初学一级) | 2013-09-03 18:08

@cattsoft: 翻看jquery 源码我可以肯定告诉你、jQuery.merge每次调用的时候传入了一个jquery的原型对象、

// Build a new jQuery matched element set
    var ret = jQuery.merge( this.constructor(), elems );
    return jQuery.merge( [], parsed.childNodes );

导致我们多次调用的时候结果叠加了、

Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-04 16:08

@cattsoft: 

// results is for internal usage only
  makeArray: function( arr, results ) {
    var ret = results || [];

    if ( arr != null ) {  
      if ( isArraylike( Object(arr) ) ) {
        jQuery.merge( ret,
          typeof arr === "string" ?
          [ arr ] : arr
        );
      } else {
        core_push.call( ret, arr );
      }
    }

    return ret;
  },

这个函数每次取得ret里面的value。

Beyond-bit | 园豆:2820 (老鸟四级) | 2013-09-04 16:09

@Beyond-bit: 

merge: function( first, second ) {
var l = second.length,
i = first.length,
j = 0;

if ( typeof l === "number" ) {
for ( ; j < l; j++ ) {
first[ i++ ] = second[ j ];
}
} else {
while ( second[j] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}

first.length = i;

return first;
},

cattsoft | 园豆:116 (初学一级) | 2013-09-04 17:35

@Beyond-bit: 

merge: function( first, second ) {
  var l = second.length,
  i = first.length,
  j = 0;

     if ( typeof l === "number" ) {
    for ( ; j < l; j++ ) {
    first[ i++ ] = second[ j ];
    }
  } else {
      while ( second[j] !== undefined ) {
        first[ i++ ] = second[ j++ ];
        }
      }

    first.length = i;

    return first;
  }

上面那个 没有格式 改下格式发上来

cattsoft | 园豆:116 (初学一级) | 2013-09-04 17:36

@cattsoft: 建议你可以使用$.merge($.merge([], this.options.initValue), s);

这样就避免了那个问题。其实$.merge的设计就是那样的,这也就是作者为什么不用contact的原因。

shen110 | 园豆:158 (初学一级) | 2013-12-05 10:16
其他回答(1)
-2

找个jquery API吧 没有我可以给你

Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-02 17:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册