2012-02-08 7 views
10

は、私がこのような構造を持っている:配列の参照の代わりに値を渡すにはどうすればよいですか?

var a = []; 
a.push({"level": 1, "column": 4, "parent": "none", "title": "Node 0", "content": "Parintele suprem", "show": "1"}); 
var b = a; 

a.push({"level": 1, "column": 5, "parent": "none", "title": "Node 1", "content": "Parintele suprem", "show": "1"}); 

console.log(b); 

今の問題はbaとして正確な内容(第2のプッシュ後のコンテンツを)持っていることです。これは私が言ったときに私が間違っていれば正しいことを示唆している。b = a私は実際に同じリファレンスをaとしたので、何でも私はaに入っています。bです。事は私が価値を渡す必要があるということです。だから私はプレビューabの値を持っています。

質問をより明確にするために編集:参照の代わりに値を渡すにはどうすればよいですか?

+0

"物事は私が値を渡す必要があるということです。だから、私はプレビューに値をbに入れています。 "または"質問のように綴ります。 " – zozo

答えて

13

は、私はあなたの参照の代わりに値をコピーするためにこれを使用することができると思う:コメントが述べたように

var b = a.slice(0); 

EDIT
、それはまた、ここに述べています:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

スライスを元の配列を変更するのではなく、元の配列からスライスした要素のコピーを含む新しい「1レベル深度」のコピーを返します。次のように元の配列の要素を新しい配列にコピーされ: オブジェクト参照新しい配列にオブジェクト参照(としない実際のオブジェクト)、スライスコピーの

  • 。元の配列と新しい配列の両方 は同じオブジェクトを参照します。参照されるオブジェクトが変更された場合、変更された配列 は、新しい配列と元の配列の両方に表示されます。文字列と数値の場合

  • (ない文字列や数値オブジェクト)、スライスコピー 文字列と数値新しい配列に。 1つの配列内の文字列または の数の変更は、他の配列には影響しません。

いずれかの配列に新しい要素が追加された場合、もう一方の配列は影響を受けません。

+1

夢のように動作します:)。私はまだ答えを受け入れることができませんしかし、私は7分後に(スタックが許せば) – zozo

+2

数字の配列にしか使えないのでしょうか? –

+0

私は現在の仕事を終えた後、簡単なテストをします:) 1つ以上の有効な回答があります私はポストに答える魔法使いをもっと速くするでしょう...私のクイックテストからスライスのように見えますが、私は論理的な説明がないので私は確信できません。 – zozo

3

はい、これはjavascriptでの参照割り当ての仕組みです。 クローンコピーを作成するオブジェクトが必要です。残念ながら、それは必要以上に複雑です。 MooToolsのようなフレームワークは最も簡単な解決法を提供するか、独自のclone関数をロールバックすることができます。

7

あなたは次のようにクローン方法で実装できます。その後、

function clone(source) { 
    var result = source, i, len; 
    if (!source 
     || source instanceof Number 
     || source instanceof String 
     || source instanceof Boolean) { 
     return result; 
    } else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') { 
     result = []; 
     var resultLen = 0; 
     for (i = 0, len = source.length; i < len; i++) { 
      result[resultLen++] = clone(source[i]); 
     } 
    } else if (typeof source == 'object') { 
     result = {}; 
     for (i in source) { 
      if (source.hasOwnProperty(i)) { 
       result[i] = clone(source[i]); 
      } 
     } 
    } 
    return result; 
}; 

を:

var b = clone(a); 

あなたが配列であることが確実な場合のみ、ニクラスのを使用します。

var b = a.slice(); 

ps:私の英語は貧しいです:)

関連する問題