7

Javascriptコンソールでは次のようになります。

var a = {'foo': []};
var b = {};

for (var key in a) {
   b[key] = a[key];
}

a['foo'].push(1);

console.log(b);

収量:

Object foo=[1]

aの各キーの各配列のbの値でコピーを作成したいと思います。もっと簡単な方法はありますか?

4

4 に答える 4

4

元のオブジェクトコンストラクターに基づいて新しいオブジェクトを作成する「クローン」関数を作成し、その元のオブジェクトのプロパティがオブジェクトの場合もクローンを作成できます。

function clone(obj){
  if(typeof(obj) != 'object' && obj != null) 
    return obj; // return the value itself if isn't an object
                // or null, since typeof  null == 'object';

    var temp = new obj.constructor();

    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}


var a = {'foo': []};
var b = clone(a);

a['foo'].push(1);

console.log(b); // Object foo=[0]
于 2009-10-23T18:34:15.830 に答える
3

これはディープコピーと呼ばれます。例は次の場所にあります。

于 2009-10-23T18:37:02.423 に答える
0

より簡単な方法:

var a = {'foo': []};
var b = a;

a['foo'].push(1);

console.log(b);

出力は同じです。

編集:

var a = {'foo': []};
var b = {};

for (var key in a) {
    if (a.hasOwnProperty(key)) {
        b[key] = [];
        for (var i = 0; i < a[key].length; i += 1) {
            b[key][i] = a[key][i];
        }
    }
}

a['foo'].push(1);

console.log(b);
于 2009-10-23T18:31:12.967 に答える
0

これにより、コードに配列のディープコピーのサポートが追加されます。

var a = {'foo': []};
var b = {};

for (var key in a) {
   if (Object.prototype.toString.call(b[key]) === "[object Array]") {
      b[key] = a[key].slice(0);
   } else {
      b[key] = a[key];
   }
}

a['foo'].push(1);

console.log(b);
于 2009-10-23T19:29:55.593 に答える