首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化两个循环

如何优化两个循环
EN

Code Review用户
提问于 2020-07-26 10:00:36
回答 2查看 198关注 0票数 3

我有一个数据集,我想在initialTasks数组中搜索任务名。

代码语言:javascript
复制
const stagesTasks = [
    {
      "dataTestID": "stage-0",
      "headerText": "Backlog",
      "initialTasks": ["task 1", "task 2", "task 3"]
    },
    {
      "dataTestID": "stage-1",
      "headerText": "To Do",
      "initialTasks": ["task 4", "task 5", "task 6"]
    },
    {
      "dataTestID": "stage-2",
      "headerText": "Ongoing",
      "initialTasks": ["task 7", "task 8"]
    },
    {
      "dataTestID": "stage-3",
      "headerText": "Done",
      "initialTasks": ["task 9"]
    }
  ]

例如,如果我想知道“任务8”的dataTestID,我必须做两个循环。如下所示-

代码语言:javascript
复制
getStageName = task => {
    for(let record of stagesTasks){
      for(let data of record.initialTasks){
        if(data === task){
          return record
        }
      }
    } 
    return null
  }

只是需要你的指导,以确定有什么办法避免两个循环吗?

EN

回答 2

Code Review用户

回答已采纳

发布于 2020-07-26 12:22:24

您可以使用find获取对象,该对象在其initialTasks数组中对给定任务进行includes。这也使用了2个循环。但是,当找到匹配并且不那么冗长时,它会返回。

代码语言:javascript
复制
const stagesTasks=[{dataTestID:"stage-0",headerText:"Backlog",initialTasks:["task 1","task 2","task 3"]},{dataTestID:"stage-1",headerText:"To Do",initialTasks:["task 4","task 5","task 6"]},{dataTestID:"stage-2",headerText:"Ongoing",initialTasks:["task 7","task 8"]},{dataTestID:"stage-3",headerText:"Done",initialTasks:["task 9"]}];

function getStageName(task) {
  return stagesTasks.find(s => s.initialTasks.includes(task))?.dataTestID
}

console.log(getStageName("task 2"))
console.log(getStageName("task 7"))
console.log(getStageName("doesn't exist"))

如果重复调用此函数,则可以创建映射对象,该对象将每个任务映射到其dataTestID。您只需使用mapper[task]来获得dataTestID。既然你提前回来了,我假设任务是独一无二的。

代码语言:javascript
复制
const stagesTasks=[{dataTestID:"stage-0",headerText:"Backlog",initialTasks:["task 1","task 2","task 3"]},{dataTestID:"stage-1",headerText:"To Do",initialTasks:["task 4","task 5","task 6"]},{dataTestID:"stage-2",headerText:"Ongoing",initialTasks:["task 7","task 8"]},{dataTestID:"stage-3",headerText:"Done",initialTasks:["task 9"]}];

const mapper = stagesTasks.reduce((acc, o) => {
  o.initialTasks.forEach(t => acc[t] = o.dataTestID)
  return acc
}, {})

function getStageName(task) {
  return mapper[task]
}

console.log(getStageName("task 2"))
console.log(getStageName("task 7"))
console.log(getStageName("task 9"))
票数 3
EN

Code Review用户

发布于 2020-07-29 13:27:27

实际情况是,数据结构迫使您执行嵌套循环。除非您更改数据结构,否则没有两种方法可以执行嵌套循环。

如果要更改数据结构,可以从O(n)的当前状态O(m x n) ( n是阶段数,m是任意阶段的最大任务数)获得这两个复杂操作。

最简单的方法可能是从initialTasksArraySet。所以就像..。

代码语言:javascript
复制
const stagesTasks = [
  {
    "dataTestID": "stage-0",
    "headerText": "Backlog",
    "initialTasks": new Set(["task 1", "task 2", "task 3"])
  },
  {
    "dataTestID": "stage-1",
    "headerText": "To Do",
    "initialTasks": new Set(["task 4", "task 5", "task 6"])
  },
  {
    "dataTestID": "stage-2",
    "headerText": "Ongoing",
    "initialTasks": new Set(["task 7", "task 8"])
  },
  {
    "dataTestID": "stage-3",
    "headerText": "Done",
    "initialTasks": new Set(["task 9"])
  }
];

const getStageByTask = (task) => {
 return stagesTasks.find( (stage) => stage.initialTasks.has(task) ) || null;
}

还有一些其他的想法:

  • 我猜您对开发和/或javascript相当陌生,所以我建议使用;来终止您的行。一般来说,在javascript中,不使用行终止符是非常宽容的,但是在不使用;的情况下,知道如何编写JS有一些问题需要注意。我建议你在完全熟悉这些情况之前使用它们。
  • getStageName可能不是函数的一个很好的名称,因为您不仅返回一个名称,而且返回一个对象。也许是getStageByTask还是类似的?
  • 在声明变量时,一定要使用const (在本例中)或let``var。所以const getStageName = ...
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/246029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档