Ecmascript 6 更新包含对象数组的状态而不进行变异

Ecmascript 6 更新包含对象数组的状态而不进行变异,ecmascript-6,redux,reducers,Ecmascript 6,Redux,Reducers,如果我有一个状态对象,如: [{ "value":"e1", "label":"john@example.com", "domain":"d1", "selected":false }, { "value":"e2", "label":"jack@example.com", "domain":"d1", "selected":false }, { "value":"e3", "label":"silvia@example.com",

如果我有一个状态对象,如:

[{
   "value":"e1",
   "label":"john@example.com",
   "domain":"d1",
   "selected":false
},
{
   "value":"e2",
   "label":"jack@example.com",
   "domain":"d1",
   "selected":false
},
{
   "value":"e3",
   "label":"silvia@example.com",
   "domain":"d1",
   "selected":false
}]
和动作对象

{
    "value":"e1",
    "label":"john@example.com",
    "domain":"d1",
    "selected":false
}
在redux reducer中,如何将动作对象“selected”更改为true并分别更新状态,而不使用纯ES6函数对其进行修改


我对Redux world非常陌生,发现在不改变状态的情况下很难更新状态。

我假设当前状态中有一大堆东西,您希望在数组中将第一个对象的选定值更改为true,然后将其与当前状态合并并更新状态

假设您的“状态对象”称为foo,在reducer函数中,您将首先执行类似于foo[0]的操作;然后可以使用spread操作符更新状态,如下所示:

return {
  ...state,
  foo
};

我希望这有点道理,或者我对你的要求有点偏离了标准?

事实上,我很久以前就自己整理了这个问题,但我认为它可能对其他人有用:

export const select = (state, action) => {

    const index = state.findIndex(elem => elem.value === action.payload.value);

    return [
        ...state.slice(0, index),
        {
            ...action.payload,
            selected: true
        },
        ...state.slice(index + 1)
    ];
};

在中有一个专门的部分对此非常有用。但是,在状态中有一个问题-哪个属性被保证为唯一值?我怀疑价值是否是独一无二的always@ArshabhAgarwal价值是独一无二的。我使用的是React Select所使用的结构,出于某种原因,它使用value作为唯一的Selectoption@CodingIntrigue是的,这正是我在更新它之前要寻找的。我还需要将状态字段全部重置为“selected”:“false”,而不改变它。