Javascript 使用上一个数组中的内容更新对象数组中的下一个数组
我有一个状态对象,看起来像这样:Javascript 使用上一个数组中的内容更新对象数组中的下一个数组,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我有一个状态对象,看起来像这样: this.state = { stages: [ {name: 'Stage 0', tasks:['task 0', 'task 1', 'task 2', 'task 3'], stageId: 0}, {name: 'Stage 1', tasks:['task 4', 'task 5', 'task 6'], stageId: 1}, {name: 'Stage 2', tasks:['task 7', 'task
this.state = {
stages: [
{name: 'Stage 0', tasks:['task 0', 'task 1', 'task 2', 'task 3'], stageId: 0},
{name: 'Stage 1', tasks:['task 4', 'task 5', 'task 6'], stageId: 1},
{name: 'Stage 2', tasks:['task 7', 'task 8'], stageId: 2},
{name: 'Stage 3', tasks:['task 9'], stageId: 3}
],
this.state = {
stages: [
{name: 'Stage 0', tasks:['task 0', 'task 1', 'task 2'], stageId: 0},
{name: 'Stage 1', tasks:['task 4', 'task 5', 'task 6', 'task 3'], stageId: 1},
{name: 'Stage 2', tasks:['task 7', 'task 8'], stageId: 2},
{name: 'Stage 3', tasks:['task 9'], stageId: 3}
],
我必须更新状态,以便单击按钮后,例如“任务3”的任务名称移动到阶段1的任务数组。更新状态应如下所示:
this.state = {
stages: [
{name: 'Stage 0', tasks:['task 0', 'task 1', 'task 2', 'task 3'], stageId: 0},
{name: 'Stage 1', tasks:['task 4', 'task 5', 'task 6'], stageId: 1},
{name: 'Stage 2', tasks:['task 7', 'task 8'], stageId: 2},
{name: 'Stage 3', tasks:['task 9'], stageId: 3}
],
this.state = {
stages: [
{name: 'Stage 0', tasks:['task 0', 'task 1', 'task 2'], stageId: 0},
{name: 'Stage 1', tasks:['task 4', 'task 5', 'task 6', 'task 3'], stageId: 1},
{name: 'Stage 2', tasks:['task 7', 'task 8'], stageId: 2},
{name: 'Stage 3', tasks:['task 9'], stageId: 3}
],
该按钮有一个onClick
事件处理程序,它将任务名称作为输入,并应将任务移动到下一阶段。我试图拼接数据并将其推送到下一阶段的任务数组,但状态更新不正确
任何帮助都会很好 使用javascript
indexOf
和splice
:
const state={
阶段:[{
名称:“阶段0”,
任务:[“任务0”、“任务1”、“任务2”、“任务3”],
阶段ID:0
},
{
名称:‘第一阶段’,
任务:[“任务4”、“任务5”、“任务6”],
第一阶段:1
},
{
名称:"第二阶段",,
任务:[‘任务7’、‘任务8’],
第一阶段:2
},
{
名称:"第三阶段",,
任务:[“任务9”],
第一阶段:3
}
],
};
const{stages}=状态;
让task3Found=false;
const newStages=stages.map(stage=>{
const task3Index=stage.tasks.indexOf('task 3');
如果(task3Index>-1){
阶段.任务.拼接(任务3索引,1);
task3Found=true;
}else if(task3Found){
stage.tasks.push(“任务3”);
task3Found=false;
}
返回阶段;
});
const newState={stages:newStages};
console.log(newState)代码>使用reducer
构建更新状态。使用indexOf
查找项目,并使用splice
删除项目
const stages=[
{
名称:“阶段0”,
任务:[“任务0”、“任务1”、“任务2”、“任务3”],
阶段ID:0
},
{名称:“阶段1”,任务:[“任务4”、“任务5”、“任务6]”,阶段ID:1},
{名称:“阶段2”,任务:[“任务7”,“任务8]”,阶段ID:2},
{名称:“阶段3”,任务:[“任务9”],阶段ID:3}
];
const updatedStages=(stages、item、new_stage)=>{
返回阶段。减少((acc,curr)=>{
const stage={…curr};
const idx=stage.tasks.indexOf(项目);
如果(idx>-1){
阶段任务拼接(idx,1);
}
if(stage.name==新的_阶段){
阶段。任务。推送(项目);
}
加速推进(阶段);
返回acc;
}, []);
};
日志(更新的阶段(阶段,“任务3”,“阶段1”);
//const{state:{stages}}=this.state;
//this.setState({stages:updatedStages(stages,“task 3”,“Stage 1”)})代码>@HereticMonkey否,actually@HereticMonkey这个问题的命名非常相似,但逻辑并非来自链接文章:“如果你看到一个问题,但不同意它确实是一个重复的问题,请编辑它以突出不同之处”(在原文中强调)。另外,一定要阅读并理解答案。请注意,投票率最高的答案将用新数组替换现有数组。考虑到你的问题缺乏解决问题的代码,重复应该会让你找到答案。难道状态不是一成不变的吗?我不能直接推()对吗?另外,我们不应该使用这个.setState()@user7098526,我没有添加更新状态。刚刚用最后的注释行更新了答案。基本上获取当前state.states,并在副本上更新(使用reduce)。