替代 for 循环中的 if else

alternative to an if else inside a for loop

目前我的代码工作正常,但我想要一个没有 if else 的代码示例的替代版本。我想将函数式编程与 find 等函数一起使用,但我对第一个循环中的第二个循环有点困惑。

代码的目的是 更新任务数组 当任务或子任务的 ID 与给定 ID 匹配时。更新后的任务(或子任务)应保持在任务数组(或子任务数组)中的相同位置

简单的事情:

const idToSearch; let index; let subIndex; 
for (const task of tasks){ 
  if (task.id === idToSearch && stuff to validate task){
     const task = update(task, parameters);
     tasks.splice(index, 1, task);  
  }
  else if (task.hasSubTasks){
     for (const subTask of task.subTasks){
        if (subTask.id = idToSearch && stuff to validate subtask){
           const subTask = update(subTask, parameters);
           task.subTasks.splice(subIndex, 1, subTask);
           tasks.splice(index,1,task);
           return;
        }
        subIndex++;
     }  

 }   
 index++; 
}

能指点一下吗?

编辑:我只是重新表述了问题,不够精确。

Edit2:更新功能是纯粹的。它接受任务(或子任务)和参数以及 returns 更新的任务/子任务。

这样的怎么样?

const updateById = (id) => {
    let task = tasks.find(t => t.id == id);
    if (task) {
        return update(task);
    }
    task = tasks.map(t => t.subTasks).flat().find(t => t.id == id);
    if (task) {
        return update(task);
    }
}

此代码使用 find 函数,根据它找到的第一个更新任务检查 id。如果找不到它,它使用map函数return每个的所有子任务(制作一个数组的数组),然后在其上调用flat()使其成为一个连续的如上所述使用 find 之前的数组。

编辑:

您一直在询问有关 return 或更新数组的问题。您不需要,因为 JavaScript 个对象只存在于一个位置。要在一个地方更新它们,就会在所有地方更新它们,除非您破坏对它们的引用。

这是一个示例,其中我更新了一个 task 但记录原始任务数组显示了新更新的任务。

const tasks = [
  {
    id: 1,
    name: "one",
    val: 1,
    subtasks: []
  },
  {
    id: 2,
    name: "two",
    val: 2,
    subtasks: []
  },
  {
    id: 3,
    name: "three",
    val: 3,
    subtasks: [{
      id: 4,
      name: "four",
      val: 4,
    }]
  },
];

const update = (task) => {
  task.val += 10;
}

const updateById = (id) => {
  let task = tasks.find(t => t.id == id);
  if (task) {
    update(task);
  }
  task = tasks.map(t => t.subtasks).flat().find(t => t.id == id);
  if (task) {
    update(task);
  }
}

updateById(4);

// Prints tasks and also shows task id = 4 with a value of 14
console.log(tasks);

注意更新的ID为4的任务是在tasks数组中修改的

如果你问的是不同的东西(我想你可能是这样):

我如何创建一个新数组,其中包含修改后的数据,然后代码将几乎相同,但我们必须在函数的开头克隆数组.

请注意,我已向该函数添加了一个 tasks 参数。

const tasks = [
  {
    id: 1,
    name: "one",
    val: 1,
    subtasks: []
  },
  {
    id: 2,
    name: "two",
    val: 2,
    subtasks: []
  },
  {
    id: 3,
    name: "three",
    val: 3,
    subtasks: [{
      id: 4,
      name: "four",
      val: 4,
    }]
  },
];

const update = (task) => {
  task.val += 10;
}

const updateById = (tasks, id) => {
  // Perform a deep clone of the array. There are many ways to do this, and much better Whosebug answers than mine on how they work
  // It is this action that "breaks the reference" to the original array and its objects
  tasks = JSON.parse(JSON.stringify(tasks));
  let task = tasks.find(t => t.id == id);
  if (task) {
    update(task);
    return tasks;
  }
  task = tasks.map(t => t.subtasks).flat().find(t => t.id == id);
  if (task) {
    update(task);
    return tasks;
  }
}

const newTasks = updateById(tasks, 4);

console.log({newTasks}, {oldTasks: tasks});

在此示例中,newTasks 已更新,同时保持原始 tasks 不变。