2012-04-14 44 views
1

下面的JavaScript代码[jsfiddle]:副本以JavaScript

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儿童:1
master2父母:2
master1父1名儿童:1个
master2父2名儿童:2
去除
master1父母后2 < - 差异

我在做什么错? 它看起来像孩子们指的是相同的数组,我也没有切片的初始儿童数组(它按照预期与父数组一起工作)。

+1

为什么不使用'.splice()'从现有数组中删除元素? – jfriend00 2012-04-14 13:05:25

+0

这不能解决原来的问题。考虑masterlist [0] .parents [0] .children.push({name:“child3”});两者都再次更新。 – 2012-04-14 13:46:11

+0

这将是很好的知道你想要做什么总体与这个脚本。 Jus粘贴代码和期望的输出不能帮助我们读取代码 – Tamil 2012-04-14 17:13:09

回答

3

在看看http://de.selfhtml.org/javascript/objekte/array.htm#slice可以提供一个潜在的答案(翻译由我完成的):

“请注意:如果包含在数组中的对象,新创建的数组包含对对象的引用。这意味着:如果对象改变了,那么使用slice()创建的数组也是如此,如果包含数字和字符串,它们将被复制。“

应该解释为什么都改变了,不应该吗?

+0

谢谢,您的假设的批准:http://jsfiddle.net/AlexZeitler/U4cpa/5/ – 2012-04-15 12:24:54