2016-11-25 60 views
2

因此,我在freecodecamp上遇到了一些問題,我被困在一個說: 「使一個函數看起來通過一個對象數組(第一個參數)並返回一個包含所有對象的數組具有匹配的屬性和值對(第二個參數)「。所以,我看着的答案,來到翻過下一代碼:瞭解函數的返回值

function whatIsInAName(collection, source) { 
    var arr = []; 
    var keys = Object.keys(source); 
    // Filter array and remove the ones that do not have the keys from source. 
    arr = collection.filter(function(obj) { 
    return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 
    }); 
    }); 

    return arr; 
} 

才明白什麼做什麼,我不能似乎得到的是collection.filter內的回報,爲什麼我們需要這兩個:

return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 

爲什麼代碼不能只用第二個。

有人可以向我解釋這一點。

+0

它可以工作,沒有'hasOwnProperty',但如果對象的祖先有屬性,這些也將被考慮給孩子。 –

+1

因爲您需要使用'return'從函數返回一個值。第一個返回從傳遞給'every'的函數返回。第二個回報是從'whatIsInAName'返回的。 – Carcigenicate

+0

閱讀https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty,瞭解關於該方法的更多詳細信息。 –

回答

1

驗證碼:

arr = collection.filter(function(obj) { 
    return keys.every(function(key) { 
     return obj.hasOwnProperty(key) && obj[key] === source[key]; 
    }); 

首先,(這是檢查wheter集合的主腳本元素匹配或不與源)

keys.every(function(key) { 
      return obj.hasOwnProperty(key) && obj[key] === source[key]; 

它只會根據obj.hasOwnProperty(key) && obj[key] === source[key];的條件返回true/false。它會檢查source中的每個密鑰。如果發現只有one key與條件不匹配,則會打破該循環,否則返回false(通過所有測試[所有鍵和值來自與集合的元素相同])返回true。

然後

​​

如果返回true,OBJ從集合將被傳遞到arr元素,否則filtered/skipped

0

collection.filter打電話給Array.prototype.filter。它用於從陣列中移除不符合特定標準的元素。作爲參數傳遞的函數用於確定元素是否符合該條件。返回值false意味着元素應該從數組中移除,而true意味着該元素應該留在數組中。

如果您沒有給出函數return聲明,它將返回undefined所有數組的元素,這是一個虛假值。

在ES6,你可以使用arrow functions不要求你寫return

function whatIsInAName(collection, source) { 
    var keys = Object.keys(source); 
    return collection.filter(obj => 
    keys.every(key => 
     obj.hasOwnProperty(key) && obj[key] === source[key]; 
    ) 
); 
}