1

配列上でアルゴリズムを実行するアプリを作っています。配列の内容はアルゴリズムの実行中に変更されるため、事前に配列の内容を別の配列に格納しています。ソース配列に対して「if」ステートメントを実行しますが、一時配列を更新してから、それらを同等にします。

問題は、アルゴリズムを実行した後でも、2つの配列が同一であるということです。一時配列を更新すると、ソース配列が自動的に更新されるようです。

このjsfiddleを作成して、次のことを示します。

var a = new Array( 0 , 1 , 2 );
var b = a;

b[1]=3;

document.write( (a[1]==b[1]) );

//Should show 'false' as this will not be correct

上記のコードは「True」を返します。これは正常な動作ですか?どうすればこれを克服できますか?

4

3 に答える 3

3

b = a配列をコピーするのではなく、参照をコピーします。コピーを作成するために使用b = a.slice()します。

こちらもご覧ください ...

于 2012-11-23T12:27:40.783 に答える
3

これは通常の動作です。配列をコピーするときは実際に参照を作成しているため、var b = a値をコピーする代わりに参照をコピーしていることを意味します

配列 (深さレベルが 1 つだけの配列) を浅いコピーする場合は、次のような単純な方法を使用できます。

var b = a.slice(0);

ただし、配列 (深さレベルが 2 つ以上の配列) をディープ コピーする場合は、以下の方法を使用できます。

var objClone = function(srcObj) {
  var destObj = (this instanceof Array) ? [] : {};
  for (var i in srcObj)
  {
     if (srcObj[i] && typeof srcObj[i] == "object") {
         destObj[i] = objClone(srcObj[i]);
     } else {
         destObj[i] = srcObj[i];
     }
  }

  return destObj;
};

これらのメソッドの両方を使用するには、この jsFiddleを確認してください

于 2012-11-23T12:28:16.597 に答える
1

他の人が述べたようa = bに、配列はコピーされません。ただし、.slice()メソッドを使用して配列をコピーする場合は、配列内のオブジェクトが参照によってコピーされることに注意してください。

次の例を見てください

var obj = { greeting: "hello world" };

var a = [ obj ];
var b = a;

a[0].greeting = "foo bar";
b[0].greeting // => "foo bar";

それ以外は大丈夫です:)

于 2012-11-23T12:36:13.103 に答える