当前位置: 首页 > 知识库问答 >
问题:

在react redux reducer getting map()中更新数组中的对象不是函数

寇和璧
2023-03-14

我有一个相当复杂/嵌套的redux存储,如下所示:

{
  object1
  {
    array:
    [
      object[1]: {
        id: 1,
        replace: ""
      }
      object[2]: {
        id: 2
        replace: ""
      }
      object[3]: {
        id: 3,
        replace: ""
      }
    ]
  }
}

在调度一个动作后,我需要根据ID将该动作插入到其中一个对象[]中。我目前正在使用以下脚本来更新减速器内的替换。但是,这会将数组更改为对象,因为对象2:{}的大括号。

case UPDATE:
  return {
    ...state,
    object1: {
      ...state.object1,
      array: {
        ...state.object1.array,
        [action.id]: {
          ...state.object1.array[action.id],
          replace: action.result
        }
      }
    }
  };

我的渲染将在此之后中断,因为object2.map在更改为object后不再是函数。如何在不将其转换为对象的情况下解决此问题?

以下操作将失败,出现语法错误:

case UPDATE:
  return {
    ...state,
    object1: {
      ...state.object1,
      array: [
        ...state.object1.array,
        [action.id]: {
          ...state.object1.array[action.id],
          replace: action.result
        }
      ]
    }
  };

共有3个答案

皇甫伟彦
2023-03-14

下面是使用不可变性帮助包的代码。

case UPDATE:
  return update(state, {
    object1: {
      array: {
        [action.id]: {
          replace: {
            $set: action.result
          },
        },
      },
    }
  });
沈子昂
2023-03-14

'您可以检查库immutadot。它的目的是以一种非常简洁的方式帮助更新复杂的嵌套数据结构,它的创建考虑了redux的使用。

在你的情况下,你可以这样写:

import { set } from 'immutadot'

...

  case UPDATE:
    return set(state, 'object1.arrary[' + id + '].replace', action.result)
    // or with templated string
    return set(state, `object1.arrary[${ id }].replace`, action.result)

...

它依赖于木材下的lodash,因此您可以使用lodash的所有功能。

朱睿
2023-03-14

你不能直接指定你想要用传播语法修改的索引,你需要先找到索引,然后像

case UPDATE:
  var idx = state.object1.object2.findIndex(obj => obj.id === action.id)
  return {
    ...state,
    object1: {
      ...state.object1,
      object2: [
        ...state.object1.object2.slice(0, idx),
        {
            ...state.object1.object2[idx],
            replace: action.result 
        }
        ...state.object1.object2.slice(idx + 1)
      ]
    }
  };

或者,您可以使用immutability helper包。有关如何操作的示例,请参见此答案

如何使用Immutability helper更新数组中的嵌套对象?

 类似资料:
  • 问题内容: 有没有一种方法可以更新对象中的值? 假设我要为id = 2的项更新名称和值项; 我尝试了以下w /猫鼬: 这种方法的问题在于它会更新/设置整个对象,因此在这种情况下,我会丢失id字段。 猫鼬中是否有更好的方法来设置数组中的某些值,但不理会其他值? 我也只查询了这个人: 问题答案: 你近了 您应该在使用update运算符时使用点符号来做到这一点:

  • 是否有方法更新对象中的值? 假设我想更新id=2的项目的名称和值项目; 我尝试过以下猫鼬: 这种方法的问题在于它更新/设置了整个对象,因此在本例中,我丢失了id字段。 在mongoose中有没有更好的方法来设置数组中的某些值,而不设置其他值? 我也问过只是人:

  • 问题内容: 如果您将数组作为状态的一部分,并且该数组包含对象,那么通过更改其中一个对象来更新状态的简便方法是什么? 示例,从关于react的教程中修改而来: 问题答案: 在更新状态时,关键部分是将其视为不变。如果可以保证,任何解决方案都可以。 这是我使用immutability-helper的解决方案: jsFiddle:

  • 我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?

  • 我想根据等于传递的属性删除嵌套对象。此时,将替换整个对象。当我尝试使用useState更新状态时,我遗漏了一些东西,可能是我循环对象的方式? 更新:问题已关闭,以响应更新嵌套对象的可用答案。这个问题涉及阵列,我认为这是当前问题的一部分。请注意此问题与的性质差异。可能需要使用语句,或者使用不同的方法对id进行过滤。。 我的初始对象看起来像这样: 我这样浏览每一项:

  • 我正在尝试更新我的猫鼬数据- 这里是数据结构- 现在我必须更新产品数量和价格。 这是我的练习-