2016-12-02 53 views
0

工作,你的鍛鍊,我這樣做是要求一個練習:過濾不人哪領域中Freecodecamp


製作,看起來通過對象(第一個參數)的陣列功能,並返回數組所有具有匹配屬性和值對的對象(第二個參數)。源對象的每個屬性和值對必須存在於集合中的對象中(如果它將包含在返回的數組中)。


我試圖做創建此:

function whatIsInAName(collection, source) { 
    // What's in a name? 
    var arr = []; 
    // Only change code below this line 
    var srcKeys = Object.keys(source); 

    arr = collection.filter(function(obj) { 
    for (var i = 0;i < srcKeys;i++) { 
     return obj.hasOwnProperty(srcKeys[i]) || obj[srcKeys[i]] == source[srcKeys[i]]; 
    } 
    }); 

    // Only change code above this line 
    return arr; 
} 


whatIsInAName([ 
    { first: "Romeo", last: "Montague" }, 
    { first: "Mercutio", last: null }, 
    { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }); 

然而,這將返回一個空數組。我想也許我並不完全瞭解過濾方法的功能。

一個上市的解決方案是:

function whatIsInAName(collection, source) { 
    // "What's in a name? that which we call a rose 
    // By any other name would smell as sweet.」 
    // -- by William Shakespeare, Romeo and Juliet 
    var srcKeys = Object.keys(source); 

    // filter the collection 
    return collection.filter(function (obj) { 
    for(var i = 0; i < srcKeys.length; i++) { 
     if(!obj.hasOwnProperty(srcKeys[i]) || obj[srcKeys[i]] !== source[srcKeys[i]]) { 

     return false; 
     } 
    } 

    return true; 
    }); 
} 

// test here 
whatIsInAName([ 
    { first: "Romeo", last: "Montague" }, 
    { first: "Mercutio", last: null }, 
    { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }); 

請儘量詳細解釋,以幫助像我這樣的小白明白爲什麼我做了什麼不給輸出給定答案:(

相同

萬分感謝您的幫助。

回答

1

有在你的代碼的兩個錯誤。

首先,在for循環中你是我比較的數組,而不是ARR ay.length。

for (var i = 0;i < srcKeys;i++) { 

應該

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

其次,你的過濾功能是解決方案的倒數。如果該項目具有密鑰並且該值與源匹配,則該解決方案僅返回true。如果項目不包含密鑰或者包含密鑰並且項目和源值相等(在本例中爲所有項目),則過濾器函數返回true。

return obj.hasOwnProperty(srcKeys[i]) || obj[srcKeys[i]] == source[srcKeys[i]]; 

應該

return obj.hasOwnProperty(srcKeys[i]) && obj[srcKeys[i]] == source[srcKeys[i]]; 
0

如果你理解了過濾功能(Array.prototype.filter)是如何工作的,你會發現你的錯誤(你有一個錯字也寫srcKeys,而不是srcKeys.length)。在數組中,當調用過濾函數時,其傳遞的回調將在數組的每個對象上運行。 該回調函數必須返回true或false。它就像是對陣列中每個對象的測試。返回true表示測試通過,返回false表示測試失敗。