2013-11-07 2 views
1

Что он должен делать - ПримерJavaScript Броски Неизвестная ошибка

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

Ошибка - TypeError: Cannot call method 'toUpperCase' of undefined

Это просто какое-то курсовую, Im застрял с этими ошибками. Любая помощь будет высоко ценится

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

    } 
} 
+0

Попробуйте использовать другую переменную, чем «строка», такие как «ул». Даже через «string» это не зарезервированное слово, оно по-прежнему является встроенным объектом, и javascript может запутаться. – Michael

+1

@Michael: 'string' нет. 'String' _is_ (хотя я все равно не буду использовать это имя, для путаницы для использования фактического конструктора). –

ответ

1

Прямо здесь:

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

Я считаю, что ты забыл процитировать:

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

Я изменил его, но теперь я получаю эту ошибку - TypeError: Не могу вызвать метод 'toUpperCase' из неопределенного – user2964960

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

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

В этом случае первое появление рисунка на всех страницах будут возвращены.

+0

Спасибо за ответ, ваше предложение странно работает с onsole.log (url1 (страницы, «Loughborough»)); и вернется правильный сайт. Однако для чего-либо еще даже onsole.log (url1 (страницы, «Loug»)); (который теоретически должен возвращать то же значение), он не работает. – user2964960

+0

Это то, что у меня есть – user2964960

+0

Помогите пожалуйста Ricardo – user2964960

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. JS будет принуждать такие вещи, как 0 и "" до == false.Если это то, что вы хотите, просто используйте оператор !, потому что выражение не имеет ничего общего со значением false.

Мой окончательный ответ http://jsfiddle.net/QF237/

+1

Ха-ха, вас обманули: 'void 0 == false' является' false'. Не волнуйся, я раньше сам пал на это. –

+0

@ Qantas94Heavy вы узнаете что-то новое каждый день = D. – sqykly

+0

@sqykly Я не понимаю, как я могу изменить это? – user2964960

Смежные вопросы