繁体   English   中英

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

[英]Each element in my array gets overwritten by last element push in

这是一个小提琴: 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> 

这是因为您要添加对数组的引用,因此每个对象都具有对同一数组的引用,请尝试使用slice克隆该数组:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM