Javascript 在Redux reducer中将所有单选按钮设置为false,然后将其中一个设置为true

Javascript 在Redux reducer中将所有单选按钮设置为false,然后将其中一个设置为true,javascript,ecmascript-6,redux,Javascript,Ecmascript 6,Redux,我似乎无法理解如何有效地将redux状态中的所有单选按钮设置为false,然后将原始动作创建者设置为true 现在,我试图使用object.assign复制state对象,同时还提供了一种方法来将item.type=='radio'的对象更改为false 我认为有些代码可能接近真实的方式 const state = { 'some_id_1': { type: 'radio', id: 'some_id_1', checked: true }, 'some_

我似乎无法理解如何有效地将redux状态中的所有单选按钮设置为false,然后将原始动作创建者设置为true

现在,我试图使用
object.assign
复制state对象,同时还提供了一种方法来将
item.type=='radio'
的对象更改为
false

我认为有些代码可能接近真实的方式

const state = {
  'some_id_1': {
    type: 'radio',
    id: 'some_id_1',
    checked: true
  }, 
  'some_id_2': {
    type: 'radio',
    id: 'some_id_2',
    checked: false
  }, 
  'some_id_3': {
    type: 'checkbox',
    id: 'some_id_3',
    checked: false
  }
};

const state = Object.assign({}, state, (item) => {
  if(item.type === 'radio') {
    console.log('reset='+item);
    item.checked = false;
  }
  return item;
});
return state;
但这当然不起作用,因为这不是
Object.assign
的工作方式

当然,我也可以循环对象的键,即“radio\u box\u 1\u id”。。。并将带有
item.type==“radio”
的任何内容设置为false,甚至将这些更改后的值输出到单独的状态对象,并使用
object.assign的另一个参数替换它。但是这些看起来像是额外的处理时间,而不是我正在寻找的完美解决方案

谢谢


编辑:我的目标是将状态项设置为未选中状态(如果它们是收音机),但尽量不要更改其他项。如果可能的话,我想有效地做这件事。之后我可以将右收音机设置为true。

虽然您没有指定
状态
形状,也没有指定
减速器
代码,但这是一种常见操作

如果我理解正确,您有一个项目(对象)数组,每个项目(对象)都有
类型
id

如果
类型
收音机
,则将选中
属性

如果这是正确的,您可以使用该方法并在检查操作负载内的
id
时有条件地返回一个新对象(使用)

下面是一个小例子:

const state=[{
键入:“收音机”,
id:1,
核对:正确
}, {
键入:“收音机”,
id:2,
勾选:假
}, {
键入:“文本”,
id:88,
价值观:“你好”
}, {
键入:“收音机”,
id:43,
勾选:假
}];
常量动作={
身份证号码:2
};
console.log('变更前',状态);
const nextState=state.map((项)=>{
如果(item.type==='radio'){
返回{
…项目,
选中:item.id==action.id
}
}
return item;//不是收音机,请继续。
});

console.log(“更改后”,nextState)如何知道要设置为true的值?它在你的行动中吗?另外,也许您可以显示一个状态示例(或者,更好的,完整的),我可以将单击的示例设置为true,因为它正在通过操作传递id。这不是我现在正在挣扎的部分。我现在的问题是。”在保持状态检查的同时,如何使用排列运算符?或者“这是否可能?”,如果你至少能给出一个你的
状态
对象的形状和你发送的动作有效载荷的例子,我想这会很有帮助。它会让我们指出如何实现你的目标。但是这些事情有什么关系,这就是上下文,但我只想用一个普通的操作符/函数来做一些事情,但有点模糊。但是是的。我认为添加一个小的状态显示会很有用。这是正确的,我就是这样做的。但是我的状态实际上是一个带有键“components”:{“id”:{…},…}`的对象,其中每个
id
键都指向一个radiobox对象,带有简单的信息,例如(id再次出现,我可能稍后删除它,键入并选中),使用对象而不是数组将非常类似。你只需要在关键点上迭代。看,我不得不投反对票:你修改后的答案没有完全克隆状态。如果在你的代码之后我运行
state['some_id_3'].foo='bar'
nextState
也会被修改,因为它们共享相同的对象引用。当然,它共享相同的引用,而且这个对象还没有被修改,这是
redux
中的常见模式。你可以在“我不能再更新我的投票”中了解更多信息(除非答案已更新)。如果你更新它,ping我,我会投票