【问题标题】:jQuery each array problemjQuery每个数组问题
【发布时间】:2011-11-19 15:24:58
【问题描述】:

我正在使用 jquery each 函数循环遍历一个数组。当我使用 splice 修改原始数组时,我为其分配了一个临时变量来循环而不是实际数组本身。然而,看起来temp 正在被修改,即使我拼接array

function example (Data, index, array) {
            var temp = array;
            $.each(temp, function(i, v) {    
                if(Data["b"+v].length > index) {
                    //do stuff
                } else {
                    array.splice(i,1);
                }
            });
            if(array.length > 0) {
                example(Data, index+1, array);
            }
}
array = [1,2,3,4]
Data = {"b1":[a,b,c,d],"b2":[e,f,g,h], "b3":[i,j], "b4":[k,l,m,n]};
example(Data, 0, array);

在第三次调用 example 时,在 temp 的第 4 次迭代中,v 变为未定义,因此下一行会输出“无法读取未定义长度”的错误。这发生在 array.splice(3,1) 被调用之后,这似乎 temp 指向与数组相同的位置,而不是它的副本。
谁能帮忙?

【问题讨论】:

    标签: javascript jquery arrays each array-splice


    【解决方案1】:

    JavaScript 中的赋值是通过引用进行的,它不会复制对象。比如……

    var obj1 = {};
    var obj2 = obj1;
    obj2.hello = "world";
    console.log( obj1.hello ); // logs "world"
    

    这是因为obj1obj2 指向内存中的同一个对象。

    如果要复制一个数组,可以使用slice方法...

    var arrayCopy = myArray.slice(0)
    

    现在arrayCopy & myArray 可以独立编辑了。但是,请注意,虽然数组本身是独立的,但它们指向相同的对象...

    arrayCopy[0] === myArray[0]; // true
    arrayCopy[0] = {my: "new object"};
    arrayCopy[0] === myArray[0]; // now false
    

    【讨论】:

      【解决方案2】:

      数组和对象是通过引用分配的。 temparray 引用同一个数组。您可以使用.slice() [MDN] 创建浅拷贝:

      var temp = array.slice();
      

      您可以以相反的顺序遍历数组,而不是创建副本:

      for(var i = array.length; i--; ) {
          if(Data["b"+array[i]].length > index) {
              //do stuff
          } else {
              array.splice(i,1);
          }
      }
      

      【讨论】:

      • 以相反的顺序遍历数组似乎更干净,谢谢。
      【解决方案3】:

      temp 只是对同一个数组的引用,所以 temp 和 array 是一回事。你想复制一份,像这样:

      temp = array.slice(0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 2012-06-23
        • 2013-11-11
        • 1970-01-01
        • 2013-04-09
        • 2012-01-07
        • 1970-01-01
        相关资源
        最近更新 更多