【问题标题】:Javascript Immutability: deep copy dictionaryJavascript不变性:深拷贝字典
【发布时间】:2020-11-06 17:43:06
【问题描述】:

我正在使用 react-redux,我想深度复制 redux 状态。

比如我有以下状态

状态 = { 测试状态:0, 数字: { 测试编号1:10, 测试编号2:20 } }

在这种情况下,我想更改 testnumber1 的值。

我试过这样,但这不起作用。

Object.assign({}, state, {testnumber1: 30} }

如何更改 testnumber1 的值?

【问题讨论】:

  • 数字格式无效。它既不是数组也不是对象
  • 由于您问题中的状态示例甚至不是有效的 JavaScript,因此无法回答您的问题。 number 是数组还是对象文字?您可以阅读如何更新状态here,如果您使用我建议使用标准 redux 模板应用程序附带的库。
  • 对不起我的错误。我编辑了我的状态

标签: javascript reactjs object react-redux immutability


【解决方案1】:

我们最好不要直接改变状态而不是返回克隆状态。 您可以使用 map 转换数组或使用 splice 获取新数组来替换旧数组。

const state = { teststate: 0, number: [ {testnumber1: 10}, {testnumber2: 20}, {testnumber3: 40} ] }
const newNumber = state.number.map(n => {
  if(Object.keys(n).toString() === 'testnumber1'){
    return {testnumber1 : 30};
  }
  return n;
});
const newState = {...state, number : newNumber};
console.log("\n newState\n", newState);
console.log("\n state\n", state);

【讨论】:

    【解决方案2】:

    使用Object.assign 你可以这样做

    state = { teststate: 0, number: { testnumber1: 10, testnumber2: 20 } }
    var newobject={teststate:state.teststate,number:Object.assign({},state.number)}
    var assign=Object.assign(newobject.number,{testnumber1:30})
    console.log(newobject)
    console.log(state)

    【讨论】:

    • 我试过这个。它可以工作,但 subscribe 方法不起作用(它不会改变值)。我想知道这两者之间的区别(我认为您的解决方案只会改变价值。不会创造新价值)。你介意来这里看看我的代码吗?我的代码在 store.js 中。链接:codesandbox.io/s/0715-logintest-2o7y7?file=/src/store.js
    • 你的意思是你想要一个具有新值的新对象吗?
    • 我已经更新了代码,让我知道它是否适合你
    • @Sven.hig Object.assign(state.number,{testnumber1:30}) 改变状态,同时尝试记录状态。
    • @HMR 谢谢你告诉我,我现在已经修好了
    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2012-04-12
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多