2016-12-02 5 views
0

に運動汝それゆえ技術では動作しません。私はを求めて運動をしています:フィルターFreecodecamp


は、オブジェクトの配列(最初の引数)を介して検索し、配列を返す関数を作ります一致するプロパティと値のペアを持つすべてのオブジェクト(2番目の引数)。ソースオブジェクトの各プロパティと値のペアが、返された配列に含まれる場合は、コレクションのオブジェクトに存在する必要があります。


私が行うことで、これを作成しようとしました。しかし、これは空白の配列を返す

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

私がやったことは与えられた答え:(

と同じ出力を与えるものではありませんなぜ私のようなnoobのを理解するために、徹底的に説明してみてください

あなたの助けのおかげ万人。

答えて

1

あなたのコード内の2個のエラーがあります。

まず、ループのためのあなたの代わりに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]]; 

を使用すると、フィルタ機能(Array.prototype.filter)がどのように動作するかを理解していれば、あなたはあなたの過ちを見つけるだろう

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

する必要があります(あなたはsrcKeysの代わりsrcKeys.lengthを書き、また、タイプミスがありました)。配列上で、filter関数が呼び出されると、渡されたコールバックは配列のすべてのオブジェクトで実行されます。 このコールバックは、trueまたはfalseのいずれかを返す必要があります。それは配列のすべてのオブジェクトのテストのようなものです。 trueを返すとテストに合格し、falseを返すと失敗したことを意味します。