Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用上一个数组中的内容更新对象数组中的下一个数组_Javascript_Arrays_Reactjs - Fatal编程技术网

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)。