2013-12-15 4 views
0

Я пишу сценарий и возникла следующая проблема. У меня есть несколько функций: A возвращает bool, B и C ничего не возвращает.Справочные массивы в JS-функциях

if (A(array1, array2, array3, int1, int2, int3, int4, bool)) { 
     B(array1, array2, array3, int1, int2, int3, int4, bool); 
    } 

B выглядит следующим образом:

B(array1, array2, array3, int1, int2, int3, int4, bool){ 
    C(array1, array2, array3, int1, int2, int3, int4, bool); 
    someCode; 
} 

C выглядит следующим образом:

C(array1, array2, array3, int1, int2, int3, int4, bool){ 
    array1 = thisFunctionChangesArrayInside(array1, some, parameters); 
    array2 = thisAnotherFunctionChangesArrayInside(array2, some, parameters); 
    someCode; 
} 

Оба thisFunctionChangesArrayInside() и thisAnotherFunctionChangesArrayInside() возвратов массивов.

Почему это неправильно? (Почему массивы не меняются?)

EDIT:

thisFunctionChangesArrayInside и thisAnotherFunctionChangesArrayInside функции:

function nowaPozycjaKolor(kolor, x1, y1, x2, y2) { 
    var pomocniczaKolor = new Array();  //tablica zupełnie pomocnicza 
    for (var i = 0; i < 8; i++) {   //ona reprezentuje kolory 
     pomocniczaKolor[i] = new Array(); 
     for (var j = 0; j < 8; j++) { 
      pomocniczaKolor[i][j] = kolor[i][j]; 
     } 
    } 
    pomocniczaKolor[x2][y2] = pomocniczaKolor[x1][y1]; 
    pomocniczaKolor[x1][y1] = 0; 
    return pomocniczaKolor; 
} 

function nowaPozycjaFigur(figury, x1, y1, x2, y2) { 
    var pomocniczaFigur = new Array();  //tablica zupełnie pomocnicza 
    for (var i = 0; i < 8; i++) {   //ona reprezentuje figury 
     pomocniczaFigur[i] = new Array(); 
     for (var j = 0; j < 8; j++) { 
      pomocniczaFigur[i][j] = figury[i][j]; 
     } 
    } 
    pomocniczaFigur[x2][y2] = pomocniczaFigur[x1][y1]; 
    pomocniczaFigur[x1][y1] = 0; 
    return pomocniczaFigur; 

} 

НЕ решение, как для меня:

function nowaPozycjaKolor(kolor, x1, y1, x2, y2) { 
    kolor[x2][y2] = kolor[x1][y1]; 
    kolor[x1][y1] = 0; 
    return kolor; 
} 

function nowaPozycjaFigur(figury, x1, y1, x2, y2) { 
    figury[x2][y2] = figury[x1][y1]; 
    figury[x1][y1] = 0; 
    return figury; 

} 

Этот almos т работает, как я хочу:

function makeNewArray(x) { 
     // make copy of array passed in 
     var y = x.slice(0); 
     // modify the copy 
     y[3]=10; 
     y[4]=20; 
     return y; 
    } 

    function funkcja(a){ 
     a = makeNewArray(a); 
    } 

    var arr = [1,2,3]; 
    alert(arr);     // [1,2,3] 
    funkcja(arr); 
    alert(arr);     // [1,2,3] 
    alert(makeNewArray(arr)); // [1,2,3,10,20] 
    alert(arr);     // [1,2,3] 
    arr = makeNewArray(arr); 
    alert(arr);     // [1,2,3,10,20] 

РЕШИТЬ:

function makeNewArray(x) { 
    // make copy of array passed in 
    var y = x.slice(0); 
    // modify the copy 
    y[3]=10; 
    y[4]=20; 
    return y; 
} 

function funkcja(a){ 
    for(var i=0;i<5;i++){ 
     a[i] = makeNewArray(a)[i]; 
     //alert(a[i]); 
     } 
} 

var arr = [1,2,3,4,5]; 
alert(arr);     // [1,2,3] 
funkcja(arr); 
alert(arr);     // [1,2,3,10,20] 
alert(makeNewArray(arr)); // [1,2,3,10,20] 
alert(arr);     // [1,2,3,10,20] 
arr = makeNewArray(arr); 
alert(arr);     // [1,2,3,10,20] 
+1

Это не похоже на JS. – elclanrs

+0

Это не сам код. –

+3

Я думаю, что имя функции неверно, вероятно, должно быть 'thisAnotherFunctionChangesArrayInsideTheOtherFunctionThatIsReallyGreat' – adeneo

ответ

0

Если вы хотите, чтобы массив передавался в качестве аргумента, который нужно изменить, тогда вы должны ИЗМЕНИТЬ массив, а не назначать переменную аргумента что-то еще.

Передача массива или объекта в качестве аргумента функции делает новую переменную (аргумент функции) и помещает эту переменную в ptr в исходный массив или объект.

Таким образом, если вы используете этот аргумент для изменения массива или объекта, исходный массив или объект модифицируется с помощью указателя на исходный объект. Но если вы назначаете новое значение этому аргументу, то это просто переменная, которая теперь указывает на другой объект. Другая переменная не изменилась и все еще указывает на исходный объект, но новая переменная теперь указывает на новый объект, а две больше не имеют ничего общего.

Изменить прошел массив:

var arr = []; 
function modifyMyArray(x) { 
    // change the array that was passed 
    x.push(1); 
} 
modifyMyArray(arr); 
console.log(arr.length); // shows 1 

Присвоить значение аргумента что-то другое:

var arr = []; 
function modifyMyArray(x) { 
    // assign the argument variable to hold a different array 
    // does not affect arr 
    x = [1,2,3]; 
} 
modifyMyArray(arr); 
console.log(arr.length); // shows 0 

Вне зависимости, она работает точно так же:

var arr = [1,2,3]; 
var x = arr; 
console.log(x); // shows [1,2,3] because x contains a ptr to the same array as arr 
x = ["a", "b"]; 
console.log(arr); // show [1,2,3] because x has just been assigned a different array 
        // and arr was unaffected by that assignment 

К создайте новый массив и верните его:

function makeNewArray(x) { 
    // make copy of array passed in 
    var y = x.slice(0); 
    // modify the copy 
    y.push(10); 
    y.push(20); 
    return y; 
} 

var arr = [1,2,3]; 
var z = makeNewArray(arr); 
console.log(z);  // [1,2,3,10,20]  
+0

Это помогло бы мне, если бы мне не нужны эти функции, чтобы возвращать что-либо, но им просто нужно вернуть эти массивы не перезаписывать их, потому что иногда я использую их для перезаписи массива, а иногда только для его получения. Любые другие идеи? –

+0

@ user3103257 - У вас есть множество вариантов: 1) Вы можете изменить существующий массив, который был передан (таким образом, оригинал). 2) Вы можете создать новый массив и вернуть его. 3) Вы можете сделать копию переданного массива, изменить эту копию и вернуть ее. Вы можете закодировать любой из них в зависимости от того, какую функцию вы хотите выполнить. Помимо объяснения того, как массивы передаются в качестве аргументов (что я и сделал), я не уверен, какой у вас другой вопрос. – jfriend00

+0

Я бы хотел создать новый массив и вернуть его, если он сработает ... Я думаю, что оставлю их такими, какие они есть, и напишу два новых, которые изменяют существующие массивы, используя эти (левые) функции. Но это 2:30 утра. Доброй ночи. –

0

Предполагая, что вы вывесили псевдокод, проблема заключается в том, что C не изменяет массивы это передается. Вместо этого он присваивает новые значения переменным, содержащим массивы, что отличается. JavaScript не имеет указателей, ссылки на массивы передаются по значению (если это звучит запутанно, см. Is JavaScript a pass-by-reference or pass-by-value language?).

+0

Должен ли я затем создавать новые локальные массивы внутри C и в цикле назначать им все новые переменные? –

+0

На самом деле проблема в функциях, называемых C, поэтому вам нужно будет показать нам свой код. – bfavaretto

+0

ehh ... Обновлено (: –

Смежные вопросы