我的数组中的每个元素都被最后一个元素推入覆盖

时间:2016-03-17 14:30:33

标签: javascript arrays

这是一个小提琴:https://jsfiddle.net/reko91/998woow6/

这是我项目中某个部分的基本版本。基本上,正如问题所说,当我将一个元素推入我的数组时,数组中已有的每个元素都会被推入的最后一个元素覆盖。

要解决问题:

  • AddToArray按钮,将nodesedges推入对象,然后将此对象推入thisArray阵列。

  • 然后点击DeleteNodesDeleteEdges,弹出nodesedges数组中的最后一个元素。

  • 然后再次按AddToArray将更新的nodesedges推送到对象中,然后推入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;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

这是因为您正在添加对数组的引用,因此每个对象都引用同一个数组,尝试使用切片克隆数组:

function addToArray() {
  var thisData = {
    nodes: nodes.slice(),
    edges: edges.slice()
  }
  thisArray.push(thisData)
  console.log('thisArray')
  console.log(thisArray)
}