在 array.map 中添加一个值是否被认为是变异的?

Is adding a value inside an array.map considered mutating?

我知道 redux 对状态管理很严格,但是从对象数组中添加一个值在 redux 中被认为是不行的吗?示例:

// Consider this array of objects on action
action.arr = [ { test: 'me', hail: 'hydra'}, { test: 'you', ring: 'of fire'} ]
// reducer.js
fn = (state = defaultState, action) => {
  ...
  case action.LORD_COMMANDER:
    return action.arr.map(v => {
      v.john = 'snow'
      return v
    })
  ...
}

这在我的减速器上是否完全安全,还是我应该使用 Object.assign()

在这种情况下,您将状态设为数组,并且由于操作中的数组总是不同,所以是的,您正在改变状态。只要对象不是引用,状态就会完全改变,脏状态的样本就是。 var objA = {}; var objB = {}; action.array = [objA, objB];

在这种情况下,当您执行映射时,您对数组的引用将是新的,但对对象的引用将是相同的。这里建议在地图函数中使用 Object.assign 或 (...) 运算符。或者更好的是我建议研究 immutablejs 来处理不可变数据

https://facebook.github.io/immutable-js/

我认为最好使用 Object.assign。让我们考虑两个例子

const arr  = [ { test: 'me', hail: 'hydra'}, { test: 'you', ring: 'of fire'} ];
const arr1 = arr.map(v => {
  v.john = 'snow'
  return v;
});

console.log(arr, arr1);

如你所见,两个数组中的每个 Object 都有 属性 john 因为我们更改 Objects 具有相同的引用而不是对于前面的 Array. 是安全的,在下面的例子中你可以看到只有在第二个 Array 对象有 属性 john 这是因为我们复制了 Object

const arr  = [ { test: 'me', hail: 'hydra'}, { test: 'you', ring: 'of fire'} ];
const arr1 = arr.map(v => {
  return Object.assign({}, v, { john: 'show' })
});

console.log(arr, arr1);