【发布时间】:2016-06-13 17:42:04
【问题描述】:
所以我正在解决这个问题,我一生都无法弄清楚为什么 .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;
}
【问题讨论】:
-
你想让代码做什么?
-
这是一个相当复杂的算法,并且变量名称并不能很好地描述您要完成的任务。当我们没有得到预期的输出以及应该如何获得输出的解释时,很难知道出了什么问题。
-
这可能不是
.length返回0的原因。在 JavaScript 中,.length是字符串的静态属性。如果string.length返回0,那么您正在查看一个空字符串。 -
combos = permAlone(str);给permAlone()函数一个递归元素。然而,permAlone()函数是return一个数字值(return sortPerms.length中sortPerms的长度),它不是您在传递该返回值时所期望的字符串进入combos。combos然后不持有预期的(必需的)值,你的算法在那个时候失败,之后的每次迭代。 -
permAlone的函数调用怎么样?缩写 perm 代表什么?请查看 Robert C. Martin 和 Michael Feathers 关于清洁代码和重构的 youtube 视频。您可以通过使用重构技术“提取方法”使您的函数 perm 更具可读性。通过使用具有说话名称的简短方法,代码可以向我们大喊它在做什么 :-) 但目前很难破译发生了什么。
标签: javascript arrays filter