2017-03-17 60 views
6

我有以下對象數組:返回對象的屬性,一旦發現爲對象的陣列中的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"] 
    } 
]; 

我想定義一個函數,lookUpProfile(firstName, prop),其對輸入數據:

lookUpProfile("Akira", "likes"); 

將返回:

["Pizza", "Coding", "Brownie Points"] 

這是我的解決方案至今沒有返回,直到事現在:

function lookUpProfile(firstName, prop){ 
    for(var i = 0; i < contacts.length; i++){ 
     if(contacts[i].firstName == firstName){ 
      for(var j = 0; j < contacts[i].length; j++){ 
       if(contacts[i].hasOwnProperty(prop)) 
        return prop; 
      } 
     } 
    } 
} 

有沒有人有任何想法來解決這個問題?謝謝

回答

1

您的問題是,您要遍歷對象,具有與數字的indeces循環。根本不需要第二個循環。這可能是那樣簡單

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

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) { 
 
    for (var i = 0; i < contacts.length; i++) { 
 
    if (contacts[i].firstName === firstName) { 
 
     if (contacts[i].hasOwnProperty(prop)) 
 
     return contacts[i][prop]; 
 
    } 
 
    } 
 
} 
 

 
console.log(lookUpProfile("Akira", "likes"))

3

你可以嘗試這樣做。使用.find()函數(ES6)查找該項目,並使用括號[]語法返回相應的屬性。

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 lookUpProfileES6(name, prop){ 
 
    var found = contacts.find(item => item.firstName === name); 
 
    if(found){ 
 
     return found[prop]; 
 
    } 
 
} 
 

 
function lookUpProfileES5(name, prop){ 
 
    var found = null; 
 
    for(var i = 0; i < contacts.length; i++){ 
 
     if(contacts[i].firstName === name){ 
 
     found = contacts[i]; 
 
     break; 
 
     } 
 
    } 
 
    
 
    if(found){ 
 
     return found[prop]; 
 
    } 
 
} 
 

 
var resultES6 = lookUpProfileES6("Akira", "likes"); 
 
var resultES5 = lookUpProfileES5("Akira", "likes"); 
 

 
console.log(resultES6); 
 
console.log(resultES5);

1

與您的代碼的問題是這條線:

for(var j = 0; j < contacts[i].length; j++){ 

沒有必要試圖在這裏再次重複。此外,contacts [i]是一個對象,因此沒有長度屬性,因此您正在比較始終爲false的0 < undefined

這會導致您對屬性從不發生的條件檢查。除此之外,道具在這裏是一個訪問者。所以雖然它可能包含屬性名稱,但它不包含屬性值。爲了正確返回屬性值,需要在當前對象上以[prop]的形式將其用作訪問器。

刪除第二次迭代,正確訪問聯繫人對象,您的功能將正常工作。

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]; 
    } 
} 
} 
1

你可以這樣做

// Create a function which will filter out the requirement 
var filtered = function(name, likes) { 
    var _toRet = '' 
    contacts.filter(function(elem, index) { 
    // check if the first name is same as requires 
    // check if the object have property likes 
    // Since the requirement is to search the likes array 
    if (elem.firstName === name && elem.hasOwnProperty(likes)) { 
     _toRet = elem[likes] 
    } 
    return _toRet // return from filter callback 

    }) 
return _toRet // return from the function 
} 

console.log(filtered('Akira', 'likes')) 

DEMO

相關問題