【问题标题】:Differnce between array of object对象数组之间的区别
【发布时间】:2019-11-01 19:27:42
【问题描述】:

我试图将一个对象推入数组。它已成功插入数组。 这三个代码有什么区别。

Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))
Array.push(Object.assign({},Object))
Array.push(Object)

【问题讨论】:

  • 代码里只有这里的函数..?
  • 首先深度复制一个 Object 对象然后推送,第二次复制一个 Object 然后推送,第三次只是推送一个 Object。
  • @Teemu 我只需要这个方法的区别
  • @ritaj 只是为了进一步说明您所说的-第二个是浅拷贝。尽管根据对象的内容,您可能会在 1 和 2 之间获得更多差异。

标签: javascript arrays node.js object


【解决方案1】:

首先,此代码可能不起作用如果您重新定义了全局对象 - Object.assign 是一个静态方法,但因为您正在处理 Object作为一个实际对象(Object 的一个实例),则无法通过该方法访问它。

代码只有在你重命名变量时才有效——我只是将它们小写了——或者如果你意识到你正在将 Object 函数推送到数组中。

第一行:

array.push(Object.assign({}, JSON.parse(JSON.stringify(object))));

object 的深层副本推送到数组。深拷贝意味着没有引用——两者是完全不同的对象。修改原来的object不会修改array里面的object的深拷贝。函数和方法将被剥离,所有undefined 值也将被剥离。循环引用(如window.window.window...)也将失败(因为您试图在字符串中放置无限数量的字符 - 这绝不是一个好主意

第二行:

array.push(Object.assign({}, object));

会将object浅拷贝推送到array。这意味着对象本身的属性将通过值复制,但嵌套对象内部的属性将通过引用复制。

第三行:

array.push(object);

将对object 的引用推送到array。这意味着如果object被修改,array里面的object也会被修改。

【讨论】:

  • 也许他只是将一个 Object 函数推送到一个数组中,谁说要重新分配?
  • 会将object 的深层副本推送到数组中”它还会修剪函数和undefined 属性等内容。所以它不一定是完美的副本。它也会因循环引用而失败。
  • 当然循环引用会失败@VLAZ - 我忘记了函数,我会把它添加到我的答案中。
【解决方案2】:
Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))

对于上面的例子,

-您正在使用 JSON.stringify() 和

从 Object 制作字符串

-使用 JSON.parse() 和

从该字符串创建一个新对象

-通过传递新的空对象 {} 再次使用 Object.assign() 创建一个新对象。

-在这里您将对象克隆到新对象并将其推送到数组。

Array.push(Object.assign({},Object))

对于上面的例子,

-您正在通过传递新的空对象 {} 使用 Object.assign() 创建一个新对象。

-在这里,您将对象克隆到新对象并将其推送到数组中

Array.push(Object)

对于上面的例子,

-您只是将对象推送到数组中。

【讨论】:

  • "您正在使用 JSON.stringify() 从 Object 制作字符串" 更具体地说,它正在序列化为 JSON。
【解决方案3】:
Array.push(Object.assign({}, JSON.parse(JSON.stringify(Object))))

它有四种不同的东西-

  1. JSON.stringify - 向 Web 服务器发送数据时,数据必须是字符串。所以你基本上将你的对象转换为String/searializing。但在您的情况下,您可能有一个深层嵌套的 object,这就是为什么您将其转换为 string/searializing 以完全克隆它,因为 objects 是引用变量。
  2. JSON.parse - 与stringify 相反,当从网络服务器接收数据时,数据总是一个字符串。当您使用 Object.assign 方法时,您需要将 cloned sting object 转换回 object
  3. Object.assign - 方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。在这里,您将复制的 object 复制到 empty object - {} 以及所有其他 own properties/ proto properties
  4. Array.push - 最后,您将新对象推送到 array

    Array.push(Object.assign({},Object))
    

在这里,您将object 的地址复制到新的empty object,然后您将其推送到array,但是这是reference,因此在此array 中对object 的任何更改都会更改原始地址object 因为你复制了对象的地址。

Array.push(Object)

在这里,您只需将object 地址直接推送到array,任何更改都会修改原始对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2023-03-23
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多