用于查找第一个字母字符的递归函数

时间:2015-04-12 21:20:07

标签: javascript

我有Javascript代码,我在其中获取大量文本,在每个时段将其分开,将其加载到数组中,并使用replace()删除任何html标记。然后,我需要使用递归函数来查找字符串中的第一个字母字符,因为我想在第一个字母字符上放置特定的格式。对我来说,它应该在substring(0,1)......

......问题是,我遇到过这个问题,第一个字母字符通常是子字符串(2,3),但并非总是如此。所以我在下面编写了递归函数。问题是0,1,2处的字符,有时3不是空格,但它不是字母字符。如果我做eval(),那么它就是未定义的'。但是当我在未定义的'之后的eval()时,我的递归函数失败了。字符。我错过了什么,但不确定是什么。

任何想法如何测试那些未定义的第一个字符'?我想它们是replace()的结果。

function getFirstLetter(text,count){
    // If first time calling the function, count will be null so set to 0
    if(count == null){
        count = 0; 
    }

    // Get the character at the count index
    thisChar = eval(text.charAt(count));

    // Is this character the first alphabetic character? If so, return
    // Here's where the problem occurs...I've noticed that the function
    // will return 'undefined' for the first few non-alphabetic characters
    // but then it stops at the first alphabetic character, no idea why
    if(thisChar != 'undefined' && thisChar != null){
        return count; 
    }else{
        // If not, call the function again for the next index
        getFirstLetter(text,count+1); 
    }
}

示例数组文本:

Here is a line of text, Here is the next line, And the next line

但如果我检查每个第一个字符,我就不会得到字母字符或空格。当我做警报(array.charAt(0))时,我得到一个没有任何内容的警报。警报中没有空格。

1 个答案:

答案 0 :(得分:1)

你可能想要的是一种利用这样的正则表达式的方法:

function getFirstLetter(text){
  return text.search(/[a-zA-Z]/);
}

您的代码存在一些问题:

  1. 如果缺少参数(例如count),函数中的undefined将不是null
  2. 检查字符串 'undefined'而不是预期的特殊值undefined
  3. 在这种情况下,使用eval似乎有点hacky和反直觉。改为使用短路OR运算符||;那么你只需要一次比较 - thisChar != null - 无论如何
  4. 您的代码完全改进了:

    function getFirstLetter(text,count){
        if(count == undefined){
            var count = 0; 
        }
        var thisChar = text.charAt(count)||null;
        if(thisChar != null){
            return count; 
        }
        else{
            getFirstLetter(text,count+1); 
        }
    }
    

    遗憾的是,你剩下的是一个无用的函数,它会返回一个数字或中止一个InternalError: too much recursion,因为charAt( n )将具有足够低的 n 以在 处返回该字符,否则将增加 n 并且始终返回{{1}因此''

    因此,请坚持使用上面的RegExp解决方案。