【问题标题】:Is object changes immutably? [duplicate]对象的变化是不变的吗? [复制]
【发布时间】:2019-04-13 04:51:26
【问题描述】:

我正在尝试对对象进行扁平化和深层复制。

这是我尝试做的一个例子:

const data = {
  firstObj: {
    data: 'Hi!',
    nestedArrayOfObject: [{
      name: 'hey',
      property: 'object'
    }],
  },
  secondObj: {
    name: 'second',
    nestedArray: []
  },
}

const object = {}
const keys = Object.keys(data)

for (let i = 0; i < keys.length; i += 1) {
  const items = Object.keys(data[keys[i]])

  for (let j = 0; j < items.length; j += 1) {
    object[items[j]] = data[keys[i]][items[j]]
  }
}

console.log(object)

据我了解,嵌套对象仅链接到新对象,而不是克隆。

如何在没有额外库的情况下正确完成?

【问题讨论】:

  • 您是要扁平化对象还是进行深度克隆?你希望最终的对象是什么样子的?
  • 预期输出是什么?
  • @MarkMeyer 我正在尝试进行扁平化并进行深度复制。
  • 如果你想把它展平,你将如何处理像name这样的重复键?
  • @MarkMeyer 我的意思是仅在两个级别上变平。示例中的代码正在执行此操作,但据我所知,它不会对 3 级对象一成不变。

标签: javascript immutability


【解决方案1】:

你可以使用JSON.parse(JSON.stringify(obj))进行深度克隆

const data = {
  firstObj: {
    data: 'Hi!',
    nestedArrayOfObject: [{
      name: 'hey',
      property: 'object'
    }],
  },
  secondObj: {
    name: 'second',
    nestedArray: []
  },
}

const object = {}
const keys = Object.keys(data)

for (let i = 0; i < keys.length; i += 1) {
  const items = Object.keys(data[keys[i]])

  for (let j = 0; j < items.length; j += 1) {
    object[items[j]] = JSON.parse(JSON.stringify(data[keys[i]][items[j]]))
  }
}

console.log(object)

【讨论】:

  • 哇!不知道这样。这是一种性能友好的方式吗?
  • 您可以阅读更多here 也可以阅读链接的答案
  • @chrisands 确实有限制...例如 Date 对象或函数
【解决方案2】:
let new_object = Object.assign({}, your_object);

【讨论】:

  • 您的回答来自质量较低的帖子。即使您的代码是不言自明的,也请提供一些解释。
【解决方案3】:

使用Object.assign:

const data = {
  firstObj: {
    data: 'Hi!',
    nestedArrayOfObject: [{
      name: 'hey',
      property: 'object'
    }],
  },
  secondObj: {
    name: 'second',
    nestedArray: []
  },
};
const object = Object.assign({}, data.firstObj, data.secondObj);

console.log(object);

或者,使用 ECMAScript 6 中引入的传播行为 ...

const data = {
  firstObj: {
    data: 'Hi!',
    nestedArrayOfObject: [{
      name: 'hey',
      property: 'object'
    }],
  },
  secondObj: {
    name: 'second',
    nestedArray: []
  },
};
const object = { ...data.firstObj, ...data.secondObj };

console.log(object);

【讨论】:

  • 您的Object.assign() 以原始对象属性为目标
  • 哎呀,我的坏@AswinKumar。
猜你喜欢
  • 2011-03-24
  • 2018-04-18
  • 2015-12-03
  • 2017-11-17
  • 2018-10-07
  • 2015-10-10
  • 1970-01-01
  • 2011-10-13
  • 2020-08-17
相关资源
最近更新 更多