使用Spread Operator更改数组中的属性返回对象而不是数组

时间:2017-02-08 17:58:49

标签: javascript reactjs redux react-redux spread-syntax

我想更改与此类似的对象的属性,这是一个具有原始属性的简化对象:

 state = {
    pivotComuns: [
      {
        id: 1,
        enabled : true
      },
      {
      id: 2,
      enabled : true
     }
   ],
   otherProperties : "otherProperties"
 }

我正在改变启用状态,如下所示:

 state = {
            ...state,
            pivotColumns: {
              ...state.pivotColumns,
              [2]: {
                ...state.pivotColumns[2], enabled: !state.pivotColumns[2].enabled
              }
            }
          }

它有效,但是返回一个像我这样的数组是pivotComuns属性,它返回一个对象,"注意我为{}更改了[]":

state = {
        pivotComuns: {
          {
            id: 1
            enabled : true
          },
          {
          id: 2,
          enabled : true
         }
       },
       otherProperties : "otherProperties"
     }

我做错了什么,我需要将该属性保留为数组。

2 个答案:

答案 0 :(得分:5)

发布很晚,但为了将来参考,您可以执行以下操作:

state = {
   ...state,
   pivotColumns: state.pivotColumns.map(pc => 
    pc.id === 2 ? {...pc, enabled:!pc.enabled} : pc
  )
}

优点是您不会更改“旧数组”中引用的对象,而是在其位置插入新对象。因此,如果你想在州内来回走动,你现在可以这样做。

例如: https://codepen.io/anon/pen/JyXqRe?editors=1111

答案 1 :(得分:2)

我不相信你可以以这种方式使用扩展运算符,事实上如果可以的话就不会推荐它,因为它会创建非常难以阅读的代码。在更新值为数组的对象上的键/值时,我每天都会使用一个更简单的解决方案:

var state = {
  pivotColumns: [
    {
      id: 1,
      enabled : true
    }, {
    id: 2,
    enabled : true
   }
 ],
 otherProperties : "otherProperties"
}

var clonedPivotColumns = state.pivotColumns.slice();

clonedPivotColumns[1].enabled = !state.pivotColumns[1].enabled;

state = {
   ...state,
   pivotColumns: clonedPivotColumns
 }

这将为您提供正确的结果,不会导致任何突变。

工作笔 http://codepen.io/finalfreq/pen/ggdJgQ?editors=1111