这是一个小提琴:https://jsfiddle.net/reko91/998woow6/
这是我项目中某个部分的基本版本。基本上,正如问题所说,当我将一个元素推入我的数组时,数组中已有的每个元素都会被推入的最后一个元素覆盖。
要解决问题:
按AddToArray
按钮,将nodes
和edges
推入对象,然后将此对象推入thisArray
阵列。
然后点击DeleteNodes
或DeleteEdges
,弹出nodes
或edges
数组中的最后一个元素。
然后再次按AddToArray
将更新的nodes
和edges
推送到对象中,然后推入thisArray
数组中,您会注意到原始对象,索引0处的对象,被刚推入的对象覆盖。
我试过在网上看,它必须与闭包有关,但我没有运气这个问题。
以下是代码,如果在此处更容易查看:
var thisArray = [];
var nodes = [1, 2, 3, 4, 5];
var edges = [1, 2, 3, 4, 5];
function addToArray() {
var thisData = {
nodes: nodes,
edges: edges
}
thisArray.push(thisData)
console.log('thisArray')
console.log(thisArray)
}
function deleteNodes() {
nodes.pop();
console.log(nodes)
}
function deleteEdges() {
edges.pop();
console.log(edges)
}

<button onclick='addToArray()'>
AddToArray
</button>
<button onclick='deleteNodes()'>
Delete Nodes
</button>
<button onclick='deleteEdges()'>
Delete Edges
</button>
&#13;
答案 0 :(得分:1)
这是因为您正在添加对数组的引用,因此每个对象都引用同一个数组,尝试使用切片克隆数组:
function addToArray() {
var thisData = {
nodes: nodes.slice(),
edges: edges.slice()
}
thisArray.push(thisData)
console.log('thisArray')
console.log(thisArray)
}