2016-05-14 8 views
1

Ich versuche, diese Funktion zu refaktorieren, aber eine Wand getroffen haben. Die Funktion versucht herauszufinden, ob ein Kontakt in einem JSON-Objekt existiert oder nicht, und wenn dies der Fall ist, bestimmen Sie, ob der zweite bereitgestellte Parameter eine Eigenschaft ist, die für das angegebene Objekt existiert.Refactoring Lookup-Funktion

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

Wird es jemals nur ein Kontakt Spiel, oder viele sein? – Andy

Antwort

2

filter aus allen Matches und das Rück true, wenn die Eigenschaft sonst false gefunden

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

Ich bin nicht genau sicher, was Sie versuchen zu tun. Die einzige Möglichkeit, mit der die Funktion beide Fälle melden kann, ist, dass sie ein Objekt mit den Ergebnissen zurückgibt. Versuchen Sie dies.

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

Sie müssen die Funktion nicht zweimal durchlaufen, wie Sie es derzeit haben. Eine schnelle Änderung wird Ihnen etwas wie folgt aus:

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

Grundsätzlich brauchen Sie nur einen Scheck auf dem Weg hinzuzufügen, dass ein bestimmter Name gefunden wurde. Wenn die Eigenschaft existiert, gibt die Funktion das Objekt zurück, aber wenn es das Ende erreicht (keine Übereinstimmung gefunden), wissen Sie, ob ein Name gefunden wurde oder nicht.

Dies setzt voraus, dass Sie nur das erste gefundene Match zurückgeben möchten.