2016-11-25 4 views
2

私はfreecodecampにいくつかの課題を抱えています。 "オブジェクトの配列(最初の引数)を調べ、すべてのオブジェクトの配列を返す関数を作成します一致するプロパティと値のペア(2番目の引数)があります。 "だから私は答えを見て、次のコードaccrossに来た:関数の戻り値を理解する

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内部のリターンが何であるかを理解し、なぜ我々はこれらの2が必要なのですか

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

なぜコードは2番目のコードでのみ機能しますか?

誰かが私にこのことを説明できますか。

+0

を渡されますが、オブジェクトの祖先が持っている場合これらの属性は子供にとっても考慮されます。 –

+1

関数から値を返すには 'return'を使う必要があるからです。最初の戻り値は 'every'に渡された関数から戻ります。 2回目の戻りは '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];の条件に基づいていずれかを返します。 sourceのすべてのキーをチェックします。 one keyが条件と一致しない場合、ループを破棄してfalseを返します(すべてのテスト[すべてのキーと値をソースからすべてコレクションの要素に渡します))trueを返します。

その後、

​​

それはtrueを返す場合は、コレクションからOBJ要素は、それがhasOwnProperty` `ずに仕事ができるそうarrfiltered/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]; 
    ) 
); 
}