1

它应该做什么 - 示例

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 "";
        }

    }
}
4

3 回答 3

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)<=0,siteContent仍然是上次迭代的任何内容。如果在第一次迭代中发生这种情况,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. 0JS 会强制使用和""to之类的东西== false。如果这是您想要的,只需使用!运算符,因为表达式与 value 无关false

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

于 2013-11-08T00:24:20.677 回答
1

就在这儿:

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

我相信你忘了引用它:

alert(url1(pages, "ALT"));
于 2013-11-07T23:44:34.120 回答
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 "";
        }    
    }
}

请告诉我们它是否有效。

编辑:看起来你的 index() 也有一点问题。请尝试以下功能。

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 "";
}

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

于 2013-11-08T00:11:42.377 回答