2013-03-26 3 views
0

jiddle - У меня есть функция, которая создает x*y array с некоторыми значениями по умолчанию value. Я хочу, чтобы это значение было некоторым массивом 2-х длинным. Но кажется, что, пройдя new Array(2) как parameter, он всегда пропускает один и тот же объект, поэтому последующее изменение любой ячейки в массиве влияет на все из них. Как сделать этот массив иметь значение default одинаковое для каждой ячейки, но independent тоже.JS такой же объект как функция параметр

On fidle Я изменяю значение некоторого поля и предупреждаю другие поля, которые зависят от первого, поскольку каждая ячейка имеет значение по умолчанию в качестве одного и того же объекта.

+0

Сделайте копию (неглубокую): 'result [i] [j] = value.slice();' –

+0

Будет ли она работать с каждым типом параметра значения? String/multi-d array и т. Д.? – OPOPO

+0

Для этого вам нужно создать глубокую копию массива –

ответ

1

У меня есть функция, которая создает массив x*y с некоторым значением по умолчанию. Я хочу, чтобы это значение будет некоторый массив 2-давно

Но тогда это не x*y 2-мерный массив больше, но x*y*2 3-мерный массив! И для этого вам нужна другая функция.

Кажется, что, передавая в качестве параметра параметр new Array(2), он всегда передает один и тот же объект, поэтому последующее изменение любой ячейки в массиве влияет на все из них.

Да. new Array(2) создает один объект, а ваш код строит 2-мерный массив с каждым полем, указывающим на него.

Как сделать их независимыми?

Вы должны будете использовать другую функцию, как

function newB(x, y, z) { 
    var result = new Array(x); 
    for (var i=0; i<x; i++) { 
     result[i] = new Array(y); 
     for (var j=0; j<y; j++) { 
      result[i][j] = new Array(z); 
     } 
    } 
    return result; 
} 

var fields = newA(5, 5, 2); 

Или, чтобы сделать его более общим, вы можете использовать некоторые заводскую функцию в качестве параметра, который строит независимые значения:

function newB(x, y, valuemaker) { 
    if (typeof valuemaker != "function") { 
     var value = valuemaker || 0; 
     valuemaker = function(){ return value; }; 
    } 
    var result = new Array(x); 
    for (var i=0; i<x; i++) { 
     result[i] = new Array(y); 
     for (var j=0; j<y; j++) { 
      result[i][j] = valuemaker(); 
     } 
    } 
    return result; 
} 

var fields = newA(5, 5, function() { 
    return new Array(2); 
}); 
Смежные вопросы