2016-11-02 2 views
0

У меня есть программа, как этотElse условие в JavaScript не работает

var contacts = [ 
    { 
     "firstName": "Akira", 
     "lastName": "Laine", 
     "number": "0543236543", 
     "likes": ["Pizza", "Coding", "Brownie Points"] 
    }, 
    { 
     "firstName": "Harry", 
     "lastName": "Potter", 
     "number": "0994372684", 
     "likes": ["Hogwarts", "Magic", "Hagrid"] 
    }, 
    { 
     "firstName": "Sherlock", 
     "lastName": "Holmes", 
     "number": "0487345643", 
     "likes": ["Intriguing Cases", "Violin"] 
    }, 
    { 
     "firstName": "Kristian", 
     "lastName": "Vos", 
     "number": "unknown", 
     "likes": ["Javascript", "Gaming", "Foxes"] 
    } 
]; 


function lookUpProfile (firstName, prop) { 
    // Only change code below this line 

    for (var i = 0; i <= contacts.length; i++) { 
     if (contacts[i].firstName===firstName) { 
      if (contacts[i].hasOwnProperty(prop)) { 
       return contacts[i][prop]; 
      } else { 
       return "No such property"; 
      } 
     } 
    } 
} 

// Change these values to test your function 
lookUpProfile("Harry", "likes"); 

Проблема в том, что если я не использую else условие, приведенный выше код работает без проблем. Но когда я добавляю условие else, первое условие не выполняется.

var contacts = [ 
    { 
     "firstName": "Akira", 
     "lastName": "Laine", 
     "number": "0543236543", 
     "likes": ["Pizza", "Coding", "Brownie Points"] 
    }, 
    { 
     "firstName": "Harry", 
     "lastName": "Potter", 
     "number": "0994372684", 
     "likes": ["Hogwarts", "Magic", "Hagrid"] 
    }, 
    { 
     "firstName": "Sherlock", 
     "lastName": "Holmes", 
     "number": "0487345643", 
     "likes": ["Intriguing Cases", "Violin"] 
    }, 
    { 
     "firstName": "Kristian", 
     "lastName": "Vos", 
     "number": "unknown", 
     "likes": ["Javascript", "Gaming", "Foxes"] 
    } 
]; 


function lookUpProfile (firstName, prop) { 
    // Only change code below this line 

    for (var i = 0; i <= contacts.length; i++) { 
     if (contacts[i].firstName === firstName) { 
      if (contacts[i].hasOwnProperty(prop)) { 
       return contacts[i][prop]; 
      } else { 
       return "No such property"; 
      } 
     } else if (contacts[i].firstName !== firstName) { 
      return "No such contact"; 
     } 
    } 
} 

// Change these values to test your function 
lookUpProfile("Harry", "likes"); 

Когда я выполняю этот код с else состоянии, первое условие не выполняется, и сразу переходит в состояние else. На каком шаге я пропущу или ошибаюсь?

+0

Что произойдет, если несколько пользователей с одним и тем же именем 'firstName'? –

ответ

4

Переместите часть else в конец функции, поскольку один return, как в цикле for, немедленно завершает функцию.

function lookUpProfile(firstName, prop) { 
 
    for (var i = 0; i < contacts.length; i++) {    // no i <= contacts.length 
 
     if (contacts[i].firstName === firstName) { 
 
      if (contacts[i].hasOwnProperty(prop)) { 
 
       return contacts[i][prop]; 
 
      } else { 
 
       return "No such property"; 
 
      } 
 
     } 
 
    } 
 
    return "No such contact"; 
 
} 
 

 
var contacts = [{ firstName: "Akira", lastName: "Laine", number: "0543236543", likes: ["Pizza", "Coding", "Brownie Points"] }, { firstName: "Harry", lastName: "Potter", number: "0994372684", likes: ["Hogwarts", "Magic", "Hagrid"] }, { firstName: "Sherlock", lastName: "Holmes", number: "0487345643", likes: ["Intriguing Cases", "Violin"] }, { firstName: "Kristian", lastName: "Vos", number: "unknown", likes: ["Javascript", "Gaming", "Foxes"] }]; 
 

 
console.log(lookUpProfile("Houdini", "likes")); 
 
console.log(lookUpProfile("Harry", "likes")); 
 
console.log(lookUpProfile("Harry", "friends"));

Короткий путь было бы использование в ES6 из Array#find

+1

проблема не в том, что «нет такого свойства», проблема связана с условием, что нет такого контента. else if (контакты [i] .firstName! == firstName) { возвращение «Нет такого контакта»; } –

+2

В качестве пояснения следует отметить, что когда вы что-то возвращаете, он отмечает конец функции и дальнейшие шаги/петли не обрабатываются. – Paul

+0

Эти решения не обрабатывают несколько объектов в массиве 'contacts' с тем же' firstName' .. Проверьте мой ответ –

1

return заявление прекращает выполнение цикла и выход из текущей функции. return всегда выводит свою функцию немедленно, не приступая к дальнейшему выполнению, если она находится внутри цикла.

В качестве альтернативы, я предлагаю ответить @Nina Scholz.

0

Что происходит, вы фактически вводите свой цикл, проверьте первый контакт, чтобы узнать, есть ли контакт, который вы ищете, а если нет, прежде чем у вас будет возможность проверить другие контакты, вы увидите return "No such contact"; линия и выход функция.

Как и в ответ @Nina Scholz «s, вы можете носить return до конца, потому что вы знаете, что если вы достигли этой точки, вы смотрели через все контакты и не вернулись из функции.

Я не хватает репутации комментировать - и, как это ответ, я представляю достижения этой цели с минимальным редактированием на код:

function lookUpProfile (firstName, prop) { 
    // Only change code below this line 

    for (var i = 0; i <= contacts.length; i++) { 
     if (contacts[i].firstName === firstName) { 
      if (contacts[i].hasOwnProperty(prop)) { 
       return contacts[i][prop]; 
      } else { 
       return "No such property"; 
      } 
     } 
    } 

    //At this point you know for sure that you haven't 
    //found the contact you're looking for. 
    return "No such contact"; 
} 
+1

вам нужно устранить часть else. –

+0

Первым другим? Зачем? Для меня это означает, что я нашел правильного человека, но у меня нет собственности, которую я ищу. Например, 'lookUpProfile (« Гарри »,« не нравится »),' – Melodi

+0

, но вы вернетесь на ранний срок, потому что позже вы можете найти некоторые. –

0

Следующая функция должна работать нормально:

function lookUpProfile(firstName, prop) 
{ 
    for(var i=0; i<contacts.length; i++) 
    { 
    if(contacts[i].firstName==firstName) 
    { 
     if(contacts[i].hasOwnProperty(prop)) 
     { 
     return contacts[i][prop]; 
     } 
     else 
     { 
     return "No such property"; 
     } 
    } 
    } 
    return "No such contact"; 
} 

в исходной функции я вижу три проблемы:

1) Проблема в для -loop состояния

оригинальный для цикла был следующий

for(var i=0; i<=contacts.length; i++) 

В цикле условие остановки я был < = contacts.length. Массив контактов имеет нулевую индексацию, поэтому исходное условие было: i «меньше, чем равно» в качестве контактов.length. Задача состоит в том, что длина контактов равна 4, но при индексировании с нулевым значением вы получите сообщение об ошибке, когда я подключаюсь к 4 и, таким образом, перейду через границы массива . Поэтому условие должно быть i меньше «contacts.length».

Fix: for(var i=0; i<contacts.length; i++)

2) Extra "=" в если -clause:

if(contacts[i].firstName===firstName) 

Fix:

if(contacts[i].firstName==firstName) 

3) Иначе, если -условию триггеры всегда, если ПгвЬЫате является не 1-й индекс

Другое условие if -condition всегда, если первый контакт это не тот, который мы ищем, т. е. если if (контакты [i] .firstName == firstName) сбой, , то else if будет true.

Исправление: Переместить «возвращение» Нет такого контакта »; до конца функции. Поскольку мы возвращаем значение из других филиалов, удобнее возвращать «Нет такого контакта», в конце концов, если мы не получим соответствия.

Надеюсь, это немного поможет. Я рад помочь вам, если у вас появятся дополнительные вопросы.

Спасибо!

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