2017-06-25 17 views
-1

これはFreeCodeCampチャレンジのためのものです: "それはあなたのアートです"。課題は「オブジェクトの配列(第1引数)を調べ、一致するプロパティと値のペア(第2引数)を持つすべてのオブジェクトの配列を返す関数を作成する」ことです。Forループソリューションと.Every()ソリューションが異なるのはなぜですか?

どのように動作するかを理解するには、解決策をチェックする必要がありました。私もと私自身の解決策を作ったのループもそれがうまく動作するかどうかを確認します。

"[{ "a": 1, "b": 2 }, { "a": 1, "b": 2, "c": 2 }]"を返す "whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 })"という引数を使用すると、.Every()メソッドが機能するように見えます。

.Every方法

function whatIsInAName(collection, source) { 
 
    // What's in a name? 
 
    var arr = []; 
 
    // Only change code below this line 
 
    var myCol = collection; 
 
    var mySou = Object.keys(source); 
 
    
 
    arr = myCol.filter(function(object){ 
 
    return mySou.every(function(key){ 
 
     return object.hasOwnProperty(key) && object[key] === source[key]; 
 
     
 
    } 
 
    ); 
 
    }); 
 
    
 
    // Only change code above this line 
 
    return arr; 
 
} 
 

 
console.log(whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

ループ方法について

function whatIsInAName(collection, source) { 
 
    // What's in a name? 
 
    var arr = []; 
 
    // Only change code below this line 
 
    var myCol = collection; 
 
    var mySou = Object.keys(source); 
 
    
 
    arr = myCol.filter(function(object){ 
 
    
 
     for (var i = 0; i < mySou.length; i++) { 
 
     return object.hasOwnProperty(mySou[i]) && object[mySou[i]] === source[mySou[i]]; 
 
     
 
    } 
 
    
 
    }); 
 
    
 
    // Only change code above this line 
 
    return arr; 
 
} 
 

 
console.log(whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

2つの質問。 ループメソッドを使用することは可能ですか?はい場合は、次のように私は唯一の「[{ "a": 1, "b": 2 }, { "a": 1, "b": 2, "c": 2 }]

+0

リターンをあなたのforループは正確に1回実行されます...戻り値が真実である間に 'every'が繰り返し実行されます –

答えて

1

を返すために、それを動作させるのですかどのようにあなたはそれが正常に動作ためにはフィルタ機能に二つの条件を追加することができますため、ループ内の

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

    arr = myCol.filter(function(object){ 

     for (var i = 0; i < mySou.length; i++) { 
     if(!(object.hasOwnProperty(mySou[i]) && object[mySou[i]] === source[mySou[i]])){ 
      return false;   # if any key value pair in the source doesn't exist in 
            # object, return false 
     }; 
    } 
    return true; # if all key value pairs in the source can be found in the object return true 
    }); 

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

whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }) 
# [ { a: 1, b: 2 }, { a: 1, b: 2, c: 2 } ] 
+1

Dang。私は別の記事でこの解決策を見てきました。自分のユニークなソリューションを作りたいと思っていました。しかし、あなたの助けに感謝します。 –

関連する問題