所以我正在研究这个问题,我一生都无法弄清楚为什么 .length 没有提出正确的值。它只返回 0,我认为这意味着它没有等待函数完成。
我尝试过在返回sortPerms.length之前使用计数器和if语句等待数组的长度相等。但它在开始时评估为真。
如果我只返回数组"sortPerms",它会返回数组中正确数量的值。
任何帮助将不胜感激!
这是代码:
var regex = /(.)1+/g;
var sortPerms = [];
function permAlone (str) {
var perms = [], combos = [], letterOne = str[0];
if (str.length === 1) {
perms.push(str);
return perms;
}
str = str.substring(1,str.length);
combos = permAlone(str);
for (var i = 0; i < combos.length; i++) {
for (var j = 0; j < combos[i].length + 1; j++) {
perms.push(combineCombos(combos[i], letterOne, j));
}
}
sortPerms = perms.filter(function(string){
return !string.match(regex);
});
return sortPerms.length;
}
function combineCombos(combo, lettersIn, i) {
var begin = combo.substring(0,i);
var end = combo.substring(i,combo.length);
return begin + lettersIn + end;
}
问题是该函数的返回值有时是数组(return perms;
),有时是数字(return sortPerms.length
)。然而,当你递归调用函数(combos = permAlone(str)
)时,你显然期望一个数组(combos.length
)。
因此,最终的返回语句应为:
return sortPerms;
现在以下调用:
permAlone("abc");
返回:
["abc","bac","bca","acb","cab","cba"]
。这似乎是你所追求的。
如果你需要数组的长度,那么不要在 return
语句中编码,而是在你的调用中编码:
console.log(permAlone("abc").length); // 6