在array.map中添加一个值是否考虑变异?

时间:2016-08-31 04:22:48

标签: javascript reactjs redux reducers

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



Moment {_isAMomentObject: true, 
_isUTC: false, 
_pf: Object, 
_locale: Locale, 
_d: Fri Jul 01 2016 00:00:00 GMT-1000 (HST)…}




这对我的减速机是否完全安全,还是应该使用// 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 }) ... }

2 个答案:

答案 0 :(得分:5)

我认为最好使用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,因为我们更改的对象具有相同的引用,这对于之前的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);




答案 1 :(得分:1)

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

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

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