我有一个数据集,我想在initialTasks数组中搜索任务名。
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,我必须做两个循环。如下所示-
getStageName = task => {
for(let record of stagesTasks){
for(let data of record.initialTasks){
if(data === task){
return record
}
}
}
return null
}只是需要你的指导,以确定有什么办法避免两个循环吗?
发布于 2020-07-26 12:22:24
您可以使用find获取对象,该对象在其initialTasks数组中对给定任务进行includes。这也使用了2个循环。但是,当找到匹配并且不那么冗长时,它会返回。
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。既然你提前回来了,我假设任务是独一无二的。
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"))发布于 2020-07-29 13:27:27
实际情况是,数据结构迫使您执行嵌套循环。除非您更改数据结构,否则没有两种方法可以执行嵌套循环。
如果要更改数据结构,可以从O(n)的当前状态O(m x n) ( n是阶段数,m是任意阶段的最大任务数)获得这两个复杂操作。
最简单的方法可能是从initialTasks从Array到Set。所以就像..。
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中,不使用行终止符是非常宽容的,但是在不使用;的情况下,知道如何编写JS有一些问题需要注意。我建议你在完全熟悉这些情况之前使用它们。getStageName可能不是函数的一个很好的名称,因为您不仅返回一个名称,而且返回一个对象。也许是getStageByTask还是类似的?const (在本例中)或let``var。所以const getStageName = ...。https://codereview.stackexchange.com/questions/246029
复制相似问题