【问题标题】:Array is undefined when prior array is deleted删除先前数组时数组未定义
【发布时间】:2019-08-15 09:41:18
【问题描述】:

以下面的代码为例,splice 用于从 Array1 中恢复一个特定项目并存储在 Popped 中。然后popped被推入array2。但是,如果我删除弹出,为什么 array2 变得未定义,即使该值已经被推送。

let Array1 = [
{id: 1, name: "APPLES"},
{id: 2, name: "ORANGE"},
{id: 3, name: "PEAR"},
{id: 4, name: "MANGO"}];
let array2 = [];

let popped  = Array1.splice(0, 1)
array2.push(popped);
console.log("Array2: ", array2[0][0].name)
document.querySelector("#First").innerHTML = "First: " + array2[0][0].name;
delete popped[0]; //why when we delete popped, value is undefined  ? 
document.querySelector("#Second").innerHTML = "Second: " + array2[0][0].name; // undefined

【问题讨论】:

  • 因为 popped 和 array2[0] 是同一个数组:array2.push(popped);: this stores popped in array2[0]。
  • 好的,我该如何绕过这个问题?有什么解决办法吗?
  • 到底是什么问题?如果您从数组中删除某些东西,它就会从数组中删除。相反将是一个相当大的问题。如果您不想删除某些内容,请不要删除它。如果您希望 array2[0] 与 popped 不同,则不要将 popped 推入 array2。如果需要,您可以推送数组的 副本
  • 我们可以在不删除 popped 原始内容的情况下推送 popped 的副本吗?怎么样?
  • 按照我的理解,拼接发生在Array1上。弹出只是一个临时存储。它实际上是 Array1 物理上丢失了一个项目。

标签: javascript arrays typescript object ecmascript-6


【解决方案1】:

您应该在将popped 添加到数组时复制它,因此添加的不是引用而是新数组。

array2.push([...popped]);

【讨论】:

  • JSON.parse(JSON.stringify(Object)) 也可以工作
  • 但它的效率要低得多@mahen23,因为它执行深度克隆。以上是浅拷贝。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多