JavaScript引发未定义的错误

时间:2013-11-07 23:42:09

标签: javascript undefined

它应该做什么 - 实施例

url1(pages,"ALT") returns "www.xyz.ac.uk" 
url1(pages,"xyz") returns ""

错误 - TypeError: Cannot call method 'toUpperCase' of undefined

这只是为了一些课程,我坚持这些错误。任何帮助将不胜感激

function index(string,pattern,caseSensitive) {
    if(caseSensitive == false) {
        var v = string.toUpperCase();
    } else {
        var v = string;
    }

    return indexNumber = v.indexOf(pattern);
}
var pages = [ "|www.lboro.ac.uk|Loughborough University offers degree programmes and world class research.", "!www.xyz.ac.uk!An alternative University" , "%www%Yet another University"];

    alert(url1(pages, "ALT"));

function url1(pages,pattern) {
    var siteContent = [];
    for(i=0;i<pages.length;i++) {
        var seperator = pages[i].charAt(0);
        if(pages[i].indexOf(seperator)>0){
            siteContent = pages[i].split(pages[i].indexOf(seperator));      
        }
        if( index(siteContent[2],pattern,false)>=0){
            return siteContent[1]; 
        }else{
            return "";
        }

    }
}

3 个答案:

答案 0 :(得分:2)

    if(pages[i].indexOf(seperator)>0){
        siteContent = pages[i].split(pages[i].indexOf(seperator));      
    }
    if( index(siteContent[2],pattern,false)>=0){
        return siteContent[1]; 
    }else{
        return "";
    }

如果pages[i].indexOf(seperator)<=0siteContent仍然是上一次迭代的结果。如果在第一次迭代时发生这种情况,siteContent仍为[],而siteContent[2]undefined

另一个问题:表达式pages[i].indexOf(seperator)返回一个数字,pages[i].split期望分隔字符串作为参数。由于数字未出现在您的输入中,因此您始终会获得单个元素数组,而siteContent[2]将始终为undefined。摆脱.indexOf(seperator),将其更改为siteContent = pages[i].split(seperator)

还有一个:摆脱else { return ""; }。在return "";循环后添加for

最后,在第一个if语句条件中,将.indexOf(seperator) > 0更改为.indexOf(seperator, 1) !== -1。由于您从字符串的第一个字符获得seperator,因此可以在0找到它。您希望第二次出现,因此请在1处开始搜索。此外,.indexOf如果找不到子字符串,则返回-1。您需要在if条件下对此进行说明。

旁注,因为这不会导致您的问题:永远不要使用== false。 JS会将0""之类的内容强制转换为== false。如果这是您想要的,只需使用!运算符,因为该表达式与值false无关。

我的最终答案是http://jsfiddle.net/QF237/

答案 1 :(得分:1)

就在这里:

alert(url1(pages, ALT)); // ALT ISN'T DEFINED

我相信你忘了引用它:

alert(url1(pages, "ALT"));

答案 2 :(得分:0)

您应该拆分传递分隔符字符本身的字符串。您的功能将如下所示:

function url1(pages,pattern) {
    var siteContent = [];
    for(i=0;i<pages.length;i++) {
        var seperator = pages[i].charAt(0);
        console.log(seperator);
        if(pages[i].indexOf(seperator)>=0){ 
            siteContent = pages[i].split(seperator);   //fixed here   
        }
        console.log(siteContent);
        if( index(siteContent[2],pattern,false)>=0){
            return siteContent[1]; 
        }else{
            return "";
        }    
    }
}

请告诉我们它是否有效。

编辑:看到你的索引()也有一点问题。请尝试以下功能。

function index(string,pattern,caseSensitive) {
    var v;
    if(caseSensitive == false) {
        v = string.toUpperCase();
        pattern = pattern.toUpperCase(); //to clarify: pattern should be uppercased also if caseSensitiveness is false
    } else {
        v = string;
    }
    return v.indexOf(pattern);
}

编辑2:

url1()最终是这样的:

function url1(pages,pattern) {
    var siteContent = [];
    for(i=0;i<pages.length;i++) {
        var seperator = pages[i].charAt(0);
        if(pages[i].indexOf(seperator)>=0){
            siteContent = pages[i].split(seperator);      
        }
        if( index(siteContent[2],pattern,false)>=0){
            return siteContent[1]; 
        }
    }
    return "";
}

在这种情况下,将返回所有页面中第一次出现的模式。