我在学校一直在学习Python,我在自己的时间学习Javascript,并处理一些JS项目.我不明白为什么我的递归函数只是一个具有相同条目的列表.我已经智穷了.如有任何见解,将不胜感激!

功能描述:

示例数据:

const dummyObject1 = {
    'courseCode': 'BLUE',
    'possibleCombos': [1, 2, 3, 4, 5]
}

const dummyObject2 = {
    'courseCode': 'RED',
    'possibleCombos': [11, 22, 33, 44]
}

const dummyObject3 = {
    'courseCode': 'PURPLE',
    'possibleCombos': [111, 222, 333, 444, 555, 666]
}

const dummyList = [dummyObject1, dummyObject2, dummyObject3]``` 

理想情况下,我想要:

let dummySchedules = recursionFunction(dummyList, {})
console.log(dummySchedules)

//ideal console output
[
{'BLUE': 1, 'RED': 11, 'PURPLE': 111},
{'BLUE': 1, 'RED': 11, 'PURPLE': 222},
{'BLUE': 1, 'RED': 11, 'PURPLE': 333},
... //and so on.
]

然而,我得到的列表输出只是同一对象的120个条目.

这是我的代码:

function recursiveFunction(listOfCourses, dictSoFar) {
    //base case, checks if listOfCourses is empty
    if (!listOfCourses.length) {
        return [dictSoFar]
    } else {
        //recursive step

        var arraySoFar = [] //accumulator

        //iterate through each element of listOfCourses[0]['possibleCombos']
        for (let combo of listOfCourses[0]['possibleCombos']) {
            //update dictSoFar entry.
            dictSoFar[listOfCourses[0]['courseCode']] = combo
            
            //filter out the course we just entered into dictSoFar.
            let course = listOfCourses[0]
            var cloneListOfCourses = listOfCourses.filter(item => item !== course)
            
            //recursive call, this time with the filtered out list. If we keep following the
            //the recursive call down, it should reach the point where listOfCourses is empty,
            //triggering the base case. At that point, dictSoFar already has all course: combo 
            //pairs. This should traverse through all possible course: combo pairs.
            var result = recursiveFunction(cloneListOfCourses, dictSoFar)
            
            //update the accumulator
            arraySoFar.push(...result)
        }
        return arraySoFar;
    }
}

发生了什么事?从理论上讲,我认为这种逻辑是有道理的,我也说不出哪里出了问题.

推荐答案

你可以这样做

如果你需要一些解释,可以问

const dummyObject1 = {
  'courseCode': 'BLUE',
  'possibleCombos': [1, 2, 3, 4, 5]
}

const dummyObject2 = {
  'courseCode': 'RED',
  'possibleCombos': [11, 22, 33, 44]
}

const dummyObject3 = {
  'courseCode': 'PURPLE',
  'possibleCombos': [111, 222, 333, 444, 555, 666]
}

const dummyList = [dummyObject1, dummyObject2, dummyObject3]

function recursiveFunction(listOfCourses) {

  const loop = (data, acc) => {
    
    if (!data.length) { // if listOfCourses is falsy
      return acc
    }
    const [next, ...rest] = data
    
    if(acc.length === 0){
      return loop(rest, next)
    }
    
    return loop(rest, next.flatMap(n => acc.flatMap(a => Object.assign({}, a, n))))
  }
  const courseCombo = listOfCourses.map(({
    courseCode,
    possibleCombos
  }) => possibleCombos.map(c => ({
    [courseCode]: c
  })))
  return loop(courseCombo, [])

}

console.log(recursiveFunction(dummyList))

Javascript相关问答推荐

在JavaScript中使用setProperty方法试图修改css元素值时,我遇到错误

如何将特定的字符串类型转换为TypScript中的字符串?

如何在react-Router-dom 6中Forking 路由?

Angular 拦截器错误处理删除方法问题

在JavaScript中,如何将请求的回调函数的结果合并到运行的代码中?

如何使用React渲染器放置根dis?

useNavigation更改URL,但不呈现或显示组件

按下同意按钮与 puppeteer 师

colored颜色 检测JS,平均图像 colored颜色 检测JS

如何在输入元素中附加一个属性为checkbox?

我怎么在JS里连续加2个骰子的和呢?

如何将多维数组插入到另一个多维数组中?

WhatsApp Cloud API上载问题:由于MIME类型不正确而导致接收&Quot;INVALID_REQUEST";错误

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

使用VUE和SCSS的数字滚动动画(&;内容生成)

如何在我的Next.js项目中.blob()我的图像文件?

在SHINY R中的嵌套模块中,不能使用Java代码

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

用于部分字符串的JavaScript数组搜索

如何更改Html元素S的 colored颜色 ,然后将其褪色为原始 colored颜色