文章起因:最近学了一天回溯算法,突然想起了之前写的惨不忍睹的代码,于是乎,我就感觉到......(狗头)
输入
const skuArr = [
{ attr: '尺寸', valueList: ['大', '小'] },
{ attr: '颜色', valueList: ['白', '红'] }
]
期望输出
[
{ "尺寸": "大", "颜色": "白" },
{ "尺寸": "大", "颜色": "红" },
{ "尺寸": "小", "颜色": "白" },
{ "尺寸": "小", "颜色": "红" }
]
回溯算法
console.log(getSku(skuArr))
function getSku(arr) {
const len = arr.length
if (len === 0) return []
const ans = []
backTrack(0, {})
return ans
function backTrack(idx, initObj) {
if (idx === len) {
ans.push({ ...initObj })
return
}
const skuItem = arr[idx]
for (const v of skuItem.valueList) {
initObj[skuItem.attr] = v
backTrack(idx + 1, initObj)
}
}
}
回溯与递归
- 递归:函数的返回值要返回给上一层,也就是说,我们需要的值依赖深层函数的返回结果 (深拷贝的例子)
- 回溯:函数的不一定有返回值,只是执行到底之拿到结果后,返回上一层,再继续找下一个结果,函数之间没有依赖关系