Javascript 使用spread操作符寻找更干净的声明方式来减少嵌套

Javascript 使用spread操作符寻找更干净的声明方式来减少嵌套,javascript,reactjs,immutability,Javascript,Reactjs,Immutability,我不喜欢在JavaScript中使用映射和循环从一个旧数组创建一个新数组,因为只有一个项目发生了变化。我有一个简单的数组,其中包含如下数据: const speakerData = [{name: 'joe',id: 101,favorite: true}, {name: 'sam',id: 102,favorite: false}, {name: 'jon',id: 103,favorite: false}]

我不喜欢在JavaScript中使用映射和循环从一个旧数组创建一个新数组,因为只有一个项目发生了变化。我有一个简单的数组,其中包含如下数据:

const speakerData = [{name: 'joe',id: 101,favorite: true},
                     {name: 'sam',id: 102,favorite: false},
                     {name: 'jon',id: 103,favorite: false}]
我想将记录102更新为favorite is true(切换favorite)

我有以下有效的代码:

const speakerId = 102;
const newSpeakerData = speakerData.map((rec) => {
  if (rec.id === speakerId) {
    rec.favorite = !rec.favorite;
    return rec;
  } else {
    return rec;
  }
});
我想要下面的东西,但显然不行

const speakerRec = speakerData.find(a=>a.id === speakerId);
speakerRec.favorite = !speakerRec.favorite;
const newSpeakerData = [{...speakerData},speakerRec]
有没有一条聪明的路线可以让ES7实现这一点

以下是答案我一直在寻找@adiga在下面的评论中给出的答案

const speakerId = parseInt(e.target.attributes['data-sessionid'].value);
const index = speakerData.findIndex((a) => a.id === speakerId);
const newSpeakerData = Object.assign([...speakerData], {
  [index]: { ...speakerData[index], favorite: !speakerData[index].favorite }
});

一个选项是,在映射的同时,也放置
favorite:id==speakerId!收藏夹:收藏夹
输入到返回的对象中:

const speakerData=[{
名字:'乔',
id:101,
最喜欢的:真的
},
{
姓名:“山姆”,
id:102,
最爱:假
},
{
姓名:“乔恩”,
身份证号码:103,
最爱:假
}
];
常数speakerId=102;
const mappedData=speakerData.map({favorite,name,id})=>({
名称
身份证件
favorite:id==speakerId?!favorite:favorite
}));

console.log(mappedData)
为了保持数组不可变,您非常需要
映射
,但是您可以通过使用条件运算符而不是
if
/
else
语句来避免使用更简洁的语法:

const speakerId = 102;
const newSpeakerData = speakerData.map((rec) =>
  rec.id === speakerId
    ? {...rec, favorite: !rec.favorite}
    : rec
);
(扩展语法用法还确保不会改变
rec
对象)

如果这仍然太长或缩进太多,您当然可以编写一个helper函数,而不是像这样使用

const matchSpeakerId = rec => rec.id === 102;
const newSpeakerData = mapWhere(speakerData, matchSpeakerId, rec => ({...rec, favorite: !rec.favorite}));

输入
find
,使用
findIndex
如:
const newSpeakerData=[…speakerData];const index=speakerData.findIndex(a=>a.id==speakerId);newSpeakerData[索引]=;setState(..)
是我遇到问题的部分with@Victor你是否在这个问题上投了赞成票而不是反对票,还是因为(将鼠标悬停在“赞成票”按钮上)“这个问题表明了研究的努力;它是有用且清晰的”?你的“或者我理解错了?”暗示着你并不是真的觉得它非常清楚。向上投票以平衡向下投票。“但显然不起作用”什么不起作用@Pete?您展示的前两行内容。我正在寻找一种比使用find或findrec更富语言的解决方案。如果不能使用扩展运算符,我理解这一点,但我见过其他示例,其中似乎可以使用类似于我建议的[…,newrec]的语法。谢谢你们,无论是谁重新打开了这个,还是谁投了赞成票。我一直在投票,我不相信你必须有一个适当的理由。