2

重複の可能性:
JavaScript オブジェクトを複製する最も効率的な方法は何ですか? (これらのほとんどは外部ライブラリを使用するか、完全には機能しません。以下のブログ投稿は、より優れたリソースです)

これは、scribd 開発者チャレンジのコンテキストにあります。彼らの API を使用すると、get_board を呼び出してボードを取得できます。しかし、私がやりたいのは、set_field で変更したそのボードのコピーを用意することです。しかし、それを行うと、独自の内部ボード オブジェクトが混乱し、コードが壊れます。だから、私が必要なのは(私が思うに) get_board を呼び出してから、オブジェクトへのポインターを壊して、自分のボードを変更することです。以下で mygame.board を使用してこれを試みましたが、それでも同じエラーが発生します。

エラーは次のとおりです。The type of an object is incompatible with the expected type of the parameter associated to the object

function new_game()
{
    var board = get_board();
    var mygame={board: board}
    mygame.board = set_field(min_max_store, mygame.board)
}

function set_field(min_max_store, board)
{

  //loop x
   //loop y
    board[x][y] = -1;
return board
}

ポインターがオブジェクトを指すのを止めて、自分のオブジェクトを変更するにはどうすればよいですか?

編集:

これは 2 次元配列で機能します。

var one = [[1,2],[2,3],[3,4],[4,5]]
var two = one.slice(0)

for(var x = 0; x <= one.length - 1; x++)
{
  two[x] = one[x].slice(0)
}

one[1][1] = 10

console.log(one)
console.log(two)

戻り値:

[[1, 2], [2, 10], [3, 4], [4, 5]]
[[1, 2], [2, 3], [3, 4], [4, 5]]
4

1 に答える 1

3

オブジェクトをそのままコピーすると、常にポインターが作成されます。しかし、これはプリミティブ型には当てはまりません。

オブジェクトをループし、そのすべてのパラメーターを再帰的に (深さのために) 取得する方法を使用できます。これを行う別の方法 (ずさんですが、うまくいきます) は、オブジェクトを JSON にエンコードし、それをデコードして新しい変数に戻すことです。

例:

var foo = 5;
// This is not a pointer, since it is a primitive type
var bar = foo;
// 'foo' will stay at 5
bar = 537;

var object_one = {
  var1: 3,
  var2: 5,
};

// This is just a pointer.
var object_two = object_one;

// This will change 'var1' of 'object_one' as well as 'object_two'
object_two.var1 = 5;

JSON の使用例:

var object_one = {
  var1: 'bar',
  var2: 5,
};
// A quick but dirty way to make a clone of the object without using a pointer 
var object_two = JSON.parse(JSON.stringify(object_one));

再帰を使用した例:

function clone_object(p_obj) {
  var new_obj = new Object;
  if (typeof(p_obj) == 'object') {
    for (var i in p_obj) {
      new_obj[i] = clone_object(p_obj[i]);
    }
    return new_obj;
  } else {
    return p_obj;
  }
}

var object_one = {
  var1: 'bar',
  var2: 5,
};
var object_two = clone_object(object_one); 

http://james.padolsey.com/javascript/deep-copying-of-objects-and-arrays/

于 2012-05-29T15:17:56.030 に答える