【问题标题】:Javascript - .length returning 0Javascript - .length 返回 0
【发布时间】: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.lengthsortPerms 的长度),它不是您在传递该返回值时所期望的字符串进入comboscombos 然后持有预期的(必需的)值,你的算法在那个时候失败,之后的每次迭代。
  • permAlone的函数调用怎么样?缩写 perm 代表什么?请查看 Robert C. Martin 和 Michael Feathers 关于清洁代码和重构的 youtube 视频。您可以通过使用重构技术“提取方法”使您的函数 perm 更具可读性。通过使用具有说话名称的简短方法,代码可以向我们大喊它在做什么 :-) 但目前很难破译发生了什么。

标签: javascript arrays filter


【解决方案1】:

问题在于该函数的返回值有时是一个数组 (return perms;),在其他情况下是一个数字 (return sortPerms.length)。然而,当您递归调用函数 (combos = permAlone(str)) 时,您显然希望得到一个数组 (combos.length)。

所以最后的return语句应该是:

return sortPerms;

现在是以下调用:

permAlone("abc");

返回:

["abc","bac","bca","acb","cab","cba"]

...这似乎是你所追求的。

如果您需要数组的长度,请不要在 return 语句中编写代码,而是在您的调用中编写:

console.log(permAlone("abc").length); // 6

【讨论】:

  • 这回答了您的问题吗?你能发表评论吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2017-03-17
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多