jQuery каждая проблема с массивом - PullRequest
1 голос
/ 18 сентября 2011

Я перебираю массив, используя jquery для каждой функции.Я назначаю временную переменную для его обхода вместо самого фактического массива, поскольку я изменяю исходный массив с помощью сплайсинга.Тем не менее, похоже, что 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);

При третьем вызове примера, на 4-й итерации temp, v становится неопределенным, и поэтому следующая строка выдает ошибку «не могу прочитать длину неопределенного».Это происходит сразу после вызова array.splice(3,1), что похоже на то, что temp указывает на то же место, что и массив, а не на его копию.
Может кто-нибудь помочь?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2011

Массивы и объекты назначаются по ссылке. temp и array ссылаются на один и тот же массив. Вы можете создать мелкую копию, используя .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);
    }
}
2 голосов
/ 18 сентября 2011

Назначения в JavaScript приведены по ссылке, объект не копируется. Например ...

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

Это потому, что obj1 и obj2 указывают на один и тот же объект в памяти.

Если вы хотите сделать копию массива, можно использовать метод 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 голосов
/ 18 сентября 2011

temp - это просто ссылка на один и тот же массив, поэтому temp и array - это одно и то же. Вы хотите сделать копию, вот так:

temp = array.slice(0);
...