替代 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
不变。
目前我的代码工作正常,但我想要一个没有 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
不变。