2016-05-14 1 views
1

Я пытаюсь реорганизовать эту функцию, но ударил стену. То, что функция пытается выполнить, определяет, существует ли контакт в объекте JSON, и если это так, определите, является ли второй предоставленный параметр свойством, существующим на указанном объекте.Функция поиска рефакторинга

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 && contacts[i].hasOwnProperty(prop)) { 
     return contacts[i][prop]; 
    } 

} 

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

} 

// Only change code above this line 
} 

// Change these values to test your function 
lookUpProfile("kyle", "lastName"); 
+0

Будет ли когда-либо будет только один контакт матч, или много? – Andy

ответ

2

filter из любых матчей и вернуть true если имущество находится еще false

function lookUpProfile(firstName, prop) { 
    var list = contacts.filter(function (el) { 
    return el.firstName === firstName; 
    }); 
    return list.length && list[0][prop] ? true : false; 
} 

lookUpProfile("kyle", "lastName"); // false 
lookUpProfile("Akira", "lastName"); // true 
lookUpProfile("Akira", "password"); // false 

DEMO

0

Я не совсем уверен, что вы пытаетесь сделать. Единственный способ, с помощью которого функция может сообщать обо всех случаях, - это вернуть объект с результатами. Попробуйте это.

function lookUpProfile(firstName, prop){ 
// Only change code below this line 
    var result ={contactExist: false, secondParameter:false}; 
    for (var i = 0; i < contacts.length; i++) { 
     if (contacts[i].firstName === firstName) { 
      result.contactExists=true; 
      result.secondParameter= contacts[i][prop]!=null; 
      return result; 
     } 
    } 
    return result; 

// Only change code above this line 
} 
1

Нет необходимости проходить через функцию дважды, как вы ее сейчас используете. Быстрое изменение даст вам что-то вроде этого:

function lookUpProfile(firstName, prop){ 
    var nameFound = false; 

    for (var i = 0; i < contacts.length; i++) { 
     var contact = contacts[i]; 
     // if a correct name is found, store that 
     if(contact.firstName === firstName){ 
      nameFound = true; 
      if(contact.hasOwnProperty(prop)) { 
       return contact[prop]; 
      } 
     }     
    } 

    return nameFound ? "No such property" : "No such contact"; 
} 

В основном вам просто нужно добавить проверку по пути, что конкретное имя было найдено. Если свойство существует, функция вернет объект, но если доходит до конца (нет совпадения найдено), вы знаете, было ли имя найдено.

Предполагается, что вы хотите вернуть только первое найденное совпадение.