Javascript 与突破和接球的深度互动

Javascript 与突破和接球的深度互动,javascript,Javascript,我写剧本有点困难 我有一个由几个模块组成的课程结构,每个模块可以有几节课 当用户进入页面时,需要定义他将选择参加的课程 业务规则是:选择尚未查看的第一课以及该课所属的模块。如果它们都是视图,请选择第一课的第一课 const课程={ 标题:“课程名称”, 持续时间:“1小时30分钟”, 模块:[ { 标题:“第一个模块”, 经验教训:[ { 标题:“第1课”, 查看:正确 }, { 标题:“第二课”, 查看:正确 } ] }, { 标题:“第二模块”, 经验教训:[ { 标题:“第1课”, 查看:

我写剧本有点困难

我有一个由几个模块组成的课程结构,每个模块可以有几节课

当用户进入页面时,需要定义他将选择参加的课程

业务规则是:选择尚未查看的第一课以及该课所属的模块。如果它们都是视图,请选择第一课的第一课

const课程={
标题:“课程名称”,
持续时间:“1小时30分钟”,
模块:[
{
标题:“第一个模块”,
经验教训:[
{
标题:“第1课”,
查看:正确
},
{
标题:“第二课”,
查看:正确
}
]
},
{
标题:“第二模块”,
经验教训:[
{
标题:“第1课”,
查看:正确
},
{
标题:“第二课”,
查看:错误
}
]
},
{
标题:“第三模块”,
经验教训:[
{
标题:“第1课”,
查看:错误
},
{
标题:“第二课”,
查看:错误
}
]
}
]
}
const selectedModule={}
const selectedLesson={}
我试过类似的东西

course.modules.find((模块)=>{
返回模块.课程.查找((课程)=>{
如果(!lesson.view){
selectedModule=模块
selectedLesson=课程
返回真值
}否则{
返回错误
}
})
})
但这似乎不是一个好的解决方案,此外,如果
find
失败,我不会执行
catch
,然后从第一个模块中选择第一课

下一步我能试试什么?

试试这样的东西

var module_and_lesson_loaded = 
  (course.modules.length>0 && course.modules.find((module))?
  course.modules.find((module) => {
   return (module.lessons.length>0 && module.lessons.find((lesson))?
    module.lessons.find((lesson) => {
    if (!lesson.viewed) {
      selectedModule = module
      selectedLesson = lesson

      return true
    } else {
      return false
    }
  }):false;
}):false;

 if(module_and_lesson_loaded){
   //your code here
 }else{
   selectedModule = course.modules[0]
   selectedLesson = selectedModule.lessons[0]
 }
我想这可能不是正确的方法,但它会检查这些数组是否为空,如果为空则返回null。

尝试类似的操作

var module_and_lesson_loaded = 
  (course.modules.length>0 && course.modules.find((module))?
  course.modules.find((module) => {
   return (module.lessons.length>0 && module.lessons.find((lesson))?
    module.lessons.find((lesson) => {
    if (!lesson.viewed) {
      selectedModule = module
      selectedLesson = lesson

      return true
    } else {
      return false
    }
  }):false;
}):false;

 if(module_and_lesson_loaded){
   //your code here
 }else{
   selectedModule = course.modules[0]
   selectedLesson = selectedModule.lessons[0]
 }
我想这可能不是正确的方法,但它会检查这些数组是否为空,如果为空则返回null。

我会这样做:

  • 查找第一个不完整的模块,即至少有一个课程未被查看的模块

  • 从匹配的模块中获取未查看的课程

  • 如果查看了所有内容,请查找至少包含一节课的第一节模块,然后获取该模块的第一课

样本数据的输出:

{title: "second module", lessons: Array(2)}
{title: "lesson 2", viewed: false}
当所有内容都设置为查看时:true

{title: "first module", lessons: Array(2)}
{title: "lesson 1", viewed: true}
我会这样做:

  • 查找第一个不完整的模块,即至少有一个课程未被查看的模块

  • 从匹配的模块中获取未查看的课程

  • 如果查看了所有内容,请查找至少包含一节课的第一节模块,然后获取该模块的第一课

样本数据的输出:

{title: "second module", lessons: Array(2)}
{title: "lesson 2", viewed: false}
当所有内容都设置为查看时:true

{title: "first module", lessons: Array(2)}
{title: "lesson 1", viewed: true}

你的解决方案可以奏效,但这不是最好的办法。您只需在开始时设置默认值

const课程={
标题:“课程名称”,
持续时间:“1小时30分钟”,
模块:[{
标题:“第一个模块”,
经验教训:[{
标题:“第1课”,
查看:正确
},
{
标题:“第二课”,
查看:正确
}
]
},
{
标题:“第二模块”,
经验教训:[{
标题:“第1课”,
查看:正确
},
{
标题:“第二课”,
查看:错误
}
]
},
{
标题:“第三模块”,
经验教训:[{
标题:“第1课”,
查看:错误
},
{
标题:“第二课”,
查看:错误
}
]
}
]
}
让selectedModule=course.modules[0]
让selectedLesson=selectedModule.lessons[0]
课程.模块.查找((模块)=>{
返回模块.课程.查找((课程)=>{
如果(!lesson.view){
selectedModule=模块
selectedLesson=课程
返回真值
}否则{
返回错误
}
})
})

console.log(selectedModule.title,selectedLesson.title)您的解决方案可以工作,但这不是最好的做法。您只需在开始时设置默认值

const课程={
标题:“课程名称”,
持续时间:“1小时30分钟”,
模块:[{
标题:“第一个模块”,
经验教训:[{
标题:“第1课”,
查看:正确
},
{
标题:“第二课”,
查看:正确
}
]
},
{
标题:“第二模块”,
经验教训:[{
标题:“第1课”,
查看:正确
},
{
标题:“第二课”,
查看:错误
}
]
},
{
标题:“第三模块”,
经验教训:[{
标题:“第1课”,
查看:错误
},
{
标题:“第二课”,
查看:错误
}
]
}
]
}
让selectedModule=course.modules[0]
让selectedLesson=selectedModule.lessons[0]
课程.模块.查找((模块)=>{
返回模块.课程.查找((课程)=>{
如果(!lesson.view){
selectedModule=模块
selectedLesson=课程
返回真值
}否则{
返回错误
}
})
})

console.log(selectedModule.title,selectedLesson.title)给定您的业务规则:

选择尚未查看的第一课以及该课所属的模块。如果它们都是视图,请选择第一课的第一课

A在这里非常有效:

//循环所有模块并执行逻辑以确定结果
const result=course.modules.reduce((firstUnviewedLesson,currentModule)=>{
//如果我们已经找到了第一个未查看的课程,请将其返回
如果(firstUnviewedLesson)返回firstUnviewedLesson
//尝试在模块中查找未查看的课程
C