[英]Each element in my array gets overwritten by last element push in
这是一个小提琴: 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>
这是因为您要添加对数组的引用,因此每个对象都具有对同一数组的引用,请尝试使用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.