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
master1 の親 1 の子: 2
master2 の親 2 の子: 2 master1 の親
を削除した後
: 1
master2 の親: 2
master1 の親 1 の子: 1
master2 の親 2 の子: 1

私はこれを期待します(そして必要とします):

master1 の親を削除する前
: 2
master2 の親: 2
master1 の親 1 の子: 2
master2 の親 2 の子: 2 master1 の親
を削除した後
: 1
master2 の親: 2
master1 の親 1 の子: 1
の master2 の親 2 の子: 2 <-- 違い

私は何を間違っていますか?子が同じ配列を参照しているように見えますが、最初の子配列もスライスしました (これは親配列で期待どおりに機能しました)。

4

1 に答える 1

3

http://de.selfhtml.org/javascript/objekte/array.htm#sliceを見ると、潜在的な答えが得られる可能性があります (翻訳は私が行いました):

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

両方が変化する理由を説明する必要がありますね。

于 2012-04-14T22:48:22.243 に答える