JavaScriptの引数について



0   名前: 困ったさん : 2007/04/17(火) 11:44  ID:dBNgdka7 sub-t1
function getSpacedAnswersAry(ARY){
var tmpAry = new Array();
for(var i=0; i<ARY.length; i++){
tmpAry[i] = new Array();
tmpAry[i] = ARY[i];
for(var s=0; s<ARY[i].length; s++){
var space1 ="";
var space2 ="";
for(var t=0; t<s; t++){
space1 += "%09";
}
for(var t=0; t<ARY[i].length-s-1; t++){
space2 += "%09";
}
tmpAry[i][s] = space1 + tmpAry[i][s] + space2;
}
}
return tmpAry;
}

別の関数から呼び出して使用しています。
まず引数に変数を使っているんですが
関数実行後に変数の値が上書きされてしまって困っています。

何か解決策があれば教えて頂きたく思います。

1   名前: NullPo : 2007/04/17(火) 11:44  ID:w8ixfYfc sub-.G
変数の値ってARYってやつのことですか?

見たトコARYに値を代入するところがないんですけど、どんなふうなんでしょ。
ARY[i]の中身がオブジェクトだと変わる、か・・・?

2   名前: 匿名 : 2007/04/17(火) 11:44  ID:FrcKAHu9 sub-Cz
>>0
> for(var s=0; s<ARY[i].length; s++)

から察するに、ARY[i] は配列なんだろう。

> tmpAry[i] = new Array();
> tmpAry[i] = ARY[i];

何やってんの?

記述通り解釈すれば、tmpAry[i] に新しい Array を代入した後、すぐにそれを破棄して、tmpAry[i] を配列 ARY[i] の「別名」にしている(tmpAry[i] は ARY[i] への参照、ポインタ)。そして、

> tmpAry[i][s] = space1 + tmpAry[i][s] + space2;

tmpAry[i][s] に新しい値を代入したわけだが、tmpAray[i] は ARY[i] の「別名」に過ぎないのだから、必然的に ARY[i][s] も変更される。

よく分からなければ、以下の例をじっくり考えてみれ。
var a = [ 1, 2, 3 ];
var b = a;
b.push (4);

alert (b);  // 1, 2, 3, 4
alert (a);  // 1, 2, 3, 4

3   名前: 困ったさん : 2007/04/17(火) 11:44  ID:gFY2524F sub-Q5
>>NullPo様
説明不足ですみませんでした。

>>匿名様
ご指摘ありがとうございました
for(var s=0; s<ARY[i].length; s++){
x = ARY[i][s];
tmpAry1[i][s] = x;
}
という方法で回避しました。

ちなみになんですが
配列にそのまま配列を代入するということは出来ないんでしょうか?

4   名前: NullPo : 2007/04/17(火) 11:44  ID:Z0FHbpib sub-ii
>>3
cloneメソッドってないんだよね。
var arrayClone = new Array().concat(array);
でコピーできるかも。

5   名前: 困ったさん : 2007/04/17(火) 11:44  ID:dBNgdka7 sub-t1
>>4
テストしてみたんですが
どうやら思ったように処理してくれないみたいです。

とはいえ
色々考えてくださって
ありがとうございました。
勉強になりました。

では。

6   名前: 匿名 : 2007/04/17(火) 11:44  ID:WHM3QXUe sub-Cz
>>5
あのさ、>>4 でも動作するはずなんだが。最悪、ループをぶん回せば何とでもなる話でしょ。

そうやって自分で試行錯誤すれば気付くはずなんだが、配列のコピーってどこまでやるつもり?ARY のような多次元配列の、各要素まで全部コピーするの?その要素も配列だったらどうする?

要素のクローンを作らない、単純コピーなら以下のようにできる。
var a = [ 1, 2, 3 ];
var b = a.concat ();
var c = a.slice (0);
var d = [ ]; d.push.apply (d, a);
var e = a.map (function (e) { return e; });

要素のクローンが必要なら再帰しる。無限再帰の可能性もあるので適当な深さで止めれ。

7   名前: 困ったさん : 2007/04/17(火) 11:44  ID:gFY2524F sub-Q5
>>NullPo様
失礼があったようで・・・
すみませんでした。。

>>匿名様
勉強になりました。
ありがとうございました。

一覧へ戻る