user2964960
user2964960

Reputation: 29

JavaScript Throws Undefined Error

What it is supposed to do - Example

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

The error - TypeError: Cannot call method 'toUpperCase' of undefined

This is just for some coursework, Im stuck with these errors. Any help would be much appreciated

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

    }
}

Upvotes: 1

Views: 185

Answers (3)

sqykly
sqykly

Reputation: 1586

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

If pages[i].indexOf(seperator)<=0, siteContent is still whatever it was from the last iteration. If that happens on the first iteration, siteContent is still [], and siteContent[2] is undefined.

Another problem: the expression pages[i].indexOf(seperator) returns a number, and pages[i].split expects a delimiting string as an argument. Since the number doesn't appear in your input, you'll always get a single-element array, and siteContent[2] will always be undefined. Get rid of .indexOf(seperator), change it to siteContent = pages[i].split(seperator).

One more: get rid of the else { return ""; }. Add a return ""; after the for loop.

Finally, in the first if statement condition, change .indexOf(seperator) > 0 to .indexOf(seperator, 1) !== -1. Since you're getting seperator from the first character of the string, it will be found at 0. You want the second occurrence, so start the search at 1. In addition, .indexOf returns -1 if it doesn't find the substring. You'll need to account for this in both if conditions.

Side note, as this is not causing your problem: never use == false. JS will coerce stuff like 0 and "" to == false. If that's what you want, just use the ! operator, because the expression has nothing to do with the value false.

My final answer is http://jsfiddle.net/QF237/

Upvotes: 2

rdonatoiop
rdonatoiop

Reputation: 1185

You should split the string passing the separator character itself. Your function then will look like:

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

Tell us if it worked, please.

EDIT: It seeems your index() also has a little problem. Please try the function below.

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

EDIT 2:

And url1() is finally like this:

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

In this case, the first occurrence of pattern in all pages will be returned.

Upvotes: 0

tymeJV
tymeJV

Reputation: 104775

Right here:

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

I believe you forgot to quote it:

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

Upvotes: 1

Related Questions