有一个对象:
const letters = {
1: ['a', 'b', 'c'],
2: ['d', 'e', 'f'],
3: ['g', 'h', 'i'],
4: ['j', 'k', 'l'],
5: ['m', 'n', 'o'],
6: ['p', 'q', 'r'],
7: ['s', 't', 'u'],
8: ['v', 'w', 'x'],
9: ['y', 'z']
}
有必要编写一个函数来返回字符串传递的数字的所有可能组合。我是这样做的:
const func = (str) => {
if (str.length === 0) return []
const strArr = str.split('')
const result = []
const arrays = strArr.map(item => letters[item])
if (strArr.length === 1) return arrays[0]
for (let letterIndex = 0; letterIndex < arrays[0].length; letterIndex++) {
const word = arrays[0][letterIndex]
for (let arrayIndex = 1; arrayIndex < arrays.length; arrayIndex++) {
for (let letterArrayIndex = 0; letterArrayIndex < arrays[arrayIndex].length; letterArrayIndex++) {
const secondWord = word + arrays[arrayIndex][letterArrayIndex]
if (arrays.length > 2) {
for (let restArrays = arrayIndex + 1; restArrays < arrays.length; restArrays++) {
for (let i = 0; i < arrays[restArrays].length; i++) {
result.push(secondWord + arrays[restArrays][i])
}
}
} else {
result.push(secondWord)
}
}
}
}
return result
}
预期结果:
func('') => []
func('2') => ['d', 'e', 'f']
func('23') => ["dg","dh","di","eg","eh","ei","fg","fh","fi"]
但显然它看起来很丑。我觉得这可以通过递归以某种方式很好地解决,但我不知道该怎么做。
func('') => []我将要求更改为func('') => ['']. 这样更合乎逻辑。没有递归的变体: