2009-08-25 9 views
2

私は、配列バーを返すメソッドを持つクラスfooを持っています。 foo.getBarを呼び出して配列をフィルタリングする別の関数があります。私は別のフィルタを使用するときにbarの元の内容をいつでも取得できるようにしたいが、bingは別の配列ではなくbarへの参照を作成しているようだ。私はreturn this.bar.valueOf()を使って試しました。私の関数fooでは、まだ動作していません。私はビンからアイテムを取り除くとき、彼らはまた、バーから削除されます。誰かが参照の代わりにユニークな配列を作成することを教えてください。値でJavascriptオブジェクトのプロパティを返すNOT参照

function foo(x, y, z){ 

    this.bar = new Array(); 
    ... 
    this.bar = [ some , stuff , in , bar ]; 

    this.getBar = function getBar(){ 
     return this.bar;  
    } 
    ... 
} 

var FooObject = new foo(x,y,z); 

function baz(){ 

    var bing = FooObject.getBar(); 

    bing.splice(remove some pieces of the array); 
} 

答えて

5

最も簡単な(と私の知る限り、最速の)方法をロールバックする必要がありますスライスメソッドを使用することです。引数がなければ、デフォルトでarray.slice(0, array.length)になるので、配列全体がコピーされます。

あなたgetBarを適用機能は、次のようになります。これは浅いコピーであるので、配列内のオブジェクトへの変更は、アイテムの追加と削除(元に影響を与えることを

this.getBar = function getBar(){ 
    return this.bar.slice();   
} 

注意がそれに影響を与えませんしかし)。オブジェクトの場合

+0

を私の配列は、オブジェクトが含まれていますが、オブジェクト自体は変更されません、彼らは再び追加する能力を必要とします。 例:[Object Ford、Object Chevy、Object Toyota、Object BMW]アメリカ車のみを表示するためにbazを走らせるかもしれないので、トヨタとBMWを配列から外して残りのオブジェクトに対してメソッドを実行できるようにしたいいくつかのHTMLをレンダリングしますが、フィルタが削除された場合は、すべての配列アイテムに対してレンダリングHTMLメソッドを再度実行できるようにしたいと考えています。オブジェクト自体は変更されず、配列のコピーから削除されます。これはうまくいくのだろうか? – Jesse

+0

これは迅速な対応のために皆様に感謝しています!これは私の初めてのスタックオーバーフローの投稿であり、それは確かに私の最後ではありません。 – Jesse

+0

はい、うまくいきます。 –

0

あなたがしなければならないことは、関数をパラメータとして渡し、値渡しを強制することです。

function foo(x, y, z) { 
    this.bar = ['uno', 'dos', 'tres']; 
} 
foo.prototype.getBar = function() { 
    return this.bar; 
} 
... 
function getBar(fn) { 
    return fn(); 
} 
... 
var f = new foo(x, y, z); 
var bing = getBar(f.getBar); 
0

「クローン」を返すと、元の配列は元の配列に戻ります。このようなクローンは浅くなることに注意してください。

function foo(x, y, z){ 

    this.bar = [ some , stuff , in , bar ]; 
    ... 
    this.getBar = function getBar(){ 
     return this.bar.concat([]); 
    } 
    ... 
} 
0

残念ながら、javascriptの配列とオブジェクトは常に参照渡しされます。あなたはfoo.bar配列は1次元であることが保証されている場合は/何の配列またはオブジェクト、

は次に、あなたが行うことができますが含まれていません:あなたの bingその結果、 foo.barの1-ディープコピーを行います
var bing = FooObject.getBar().slice(0); 

アレイは foo.barアレイから独立しています。

そうしないと、このようなMooToolsの中に$関数として深いコピー方法を、見つける/コピーを取得するために

var newArray = $A(oldArray) 
2

、cloneメソッドを使用します。

function cloneObject(source) { 
    for (i in source) { 
     if (typeof source[i] == 'source') { 
      this[i] = new cloneObject(source[i]); 
     } 
     else { 
      this[i] = source[i]; 
     } 
    } 
} 

var obj1= {bla:'blabla',foo:'foofoo',etc:'etc'}; 

var obj2= new cloneObject(obj1); 
関連する問題