2012-04-14 2 views
1

次のJavaScriptコード[jsfiddle]:コピー

Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

var masterlist = [{ 
    name: "Master1"}, 
{ 
    name: "Master2"}]; 
var parentlist = [{ 
    name: "Parent1"}, 
{ 
    name: "Parent2"}]; 
var childlist = [{ 
    name: "Child1"}, 
{ 
    name: "Child2"}]; 

for (var i = 0; i < masterlist.length; i++) { 
    var master = masterlist[i]; 
    master.parents = parentlist.slice(); 
    for (var j = 0; j < master.parents.length; j++) { 
     var parent = master.parents[j]; 
     parent.children = childlist.slice(); 
    } 
} 

console.log("before removing") 
console.log("master1 parents: " + masterlist[0].parents.length); 
console.log("master2 parents: " + masterlist[1].parents.length); 
console.log("master1 parent 1 childrens: " + masterlist[0].parents[0].children.length); 
console.log("master2 parent 2 childrens: " + masterlist[1].parents[1].children.length); 

masterlist[0].parents.remove(0); 
masterlist[0].parents[0].children.remove(0); 

console.log("after removing") 
console.log("master1 parents: " + masterlist[0].parents.length); 
console.log("master2 parents: " + masterlist[1].parents.length); 
console.log("master1 parent 1 childrens: " + masterlist[0].parents[0].children.length); 
console.log("master2 parent 2 childrens: " + masterlist[1].parents[1].children.length);? 

結果で:


MASTER1親を除去する前に:2
MASTER2両親:2
マスター1親1子ども:2
master2親2子ども:2
削除後
人の MASTER1両親:1
MASTER2両親:2
MASTER1親1人の子供:1つの
マスター2の親2人の子供:取り外す前に

:1

が、私はこれを期待(および必要)です
MASTER1両親:2
MASTER2両親:2
MASTER1親1人の子供:2
マスター2の親2子供:1
MASTER2両親:2
MASTER1親1人の子供:1つの
マスター2の親2人の子供:2

MASTER1両親除去した後の2 < - 私が間違って何をやっているの違いを

? 子供が同じ配列を参照しているように見えますが、私は初期の子配列をスライスしました(これは期待通りに親配列で機能しました)。

+1

既存の配列から要素を削除するのに '.splice()'を使わないのはなぜですか? – jfriend00

+0

これは元の問題を解決しません。 masterlist [0] .parents [0] .children.push({name: "child3"})を考慮してください。両方が再び更新されます。 –

+0

このスクリプトを使って全体的に何をしようとしているのかは分かります。 Jusがコードと期待される出力を貼り付けることで、コード – Tamil

答えて

3

http://de.selfhtml.org/javascript/objekte/array.htm#sliceを見ては、(私によって行わ翻訳)潜在的な答えを提供できる持つ:

「ご注意:配列内に含まれるオブジェクトがある場合は、新しく作成された配列は、そのオブジェクトへの参照が含まれています。つまり、オブジェクトが変更された場合、slice()を使用して作成された配列も変更されます。数値と文字列が含まれている場合はコピーされます。

両方の理由を説明する必要がありますか?

+0

ありがとうございます、あなたの前提の承認:http://jsfiddle.net/AlexZeitler/U4cpa/5/ –