2016-07-29 2 views
3

JavaScriptの特定の問題を解決するための擬似コードがありますコードに変換する方法で私の頭をラップする:純粋なJavaScriptを使用すると、オブジェクトのコレクションとフィルタオブジェクトがある場合、フィルタオブジェクトと同じキーと値のペアを持つコレクション内のオブジェクトを返します

var sampleCollection = [ 
    { 'a': 1, 'b': 2, 'c': 3 }, 
    { 'a': 4, 'b': 5, 'c': 6 } 
]; 

var sampleFilter = { 'a': 4, 'c': 6 }; 

function getCollectionFilter(collection,filter) { 
    function collectionFilter(collection,filter) { 
    //return if for each element in filter, 
    //collection's key/value pair is same with filter's key/value pair 
    } 

    return collection.filter(collectionFilter); 
} 

getCollectionFilter(sampleCollection,sampleFilter); 
// -> { 'a': 4, 'b': 5, 'c': 6}; 

私はlodashはこれを解決する_.matchesを持っていると思うが、私は物事が特定の方法で行われている理由を知りたいとの意味は何ですか/そうでなければ結果。ソリューション/練習は "最高"

+0

なぜフィルタは 'b ':5'を返すのでしょうか? – Aeolingamenfel

+0

@ aeingingamenfelなぜなら 'a'と' c'の値が一致しているからです。 – Pureferret

+0

ああ、私はフィルターの仕組みを誤解していました。 – Aeolingamenfel

答えて

3

使用Array#filterArray#every方法

var sampleCollection = [{ 
 
    'a': 1, 
 
    'b': 2, 
 
    'c': 3 
 
}, { 
 
    'a': 4, 
 
    'b': 5, 
 
    'c': 6 
 
}]; 
 

 
var sampleFilter = { 
 
    'a': 4, 
 
    'c': 6 
 
}; 
 

 
function getCollectionFilter(collection, filter) { 
 
    // filter out elements and return 
 
    return collection.filter(function(v) { 
 
    // get all object keys 
 
    return Object.keys(filter) 
 
     // use `every` method and check all values are equal 
 
     .every(function(k) { 
 
     // compare values 
 
     return filter[k] == v[k]; 
 
     }); 
 
    }) 
 
} 
 
console.log(
 
    getCollectionFilter(sampleCollection, sampleFilter) 
 
);


である理由に、現実世界でのコンテキストを与えるため

ボーナス

ES6 arrow functionで1行にすることができます。 (パンチに私を打つ)...私はちょうどArray.prototype.filterに渡す関数を作成するのではなく、コレクションを必要とするためのフィルタ工場を使用していPranav Cバランの答えと同様に

var sampleCollection = [{ 
 
    'a': 1, 
 
    'b': 2, 
 
    'c': 3 
 
}, { 
 
    'a': 4, 
 
    'b': 5, 
 
    'c': 6 
 
}]; 
 

 
var sampleFilter = { 
 
    'a': 4, 
 
    'c': 6 
 
}; 
 

 
function getCollectionFilter(collection, filter) { 
 
    return collection.filter(v => Object.keys(filter).every(k => filter[k] == v[k])) 
 
} 
 
console.log(
 
    getCollectionFilter(sampleCollection, sampleFilter) 
 
);

+0

概要:http://stackoverflow.com/a/38664372/747579 –

0

実際に値を比較する前に、一致するキーが存在するかどうかについて事前ループチェックを行います。

let filterer = test => { 
    let keys = Object.keys(test).sort(); 
    let keyMatch = new RegExp(keys.toString); 
    return obj => { 
    let objKeys = Object.keys(obj).sort().toString(); 
    return objKeys.match(keyMatch) && keys.every(k => test[k] === obj[k]); 
    } 
}; 

let passes = arrOfObjects.filter(filterer(testCase)); 
+0

追加のお返事ありがとうございます。 Pranavの答えは、私のコードを簡潔に編集して動作させることでした。私はあなたがES6の機能を使用していることに気付きました。上記と比較して、パフォーマンス、スケーラビリティ、可読性(スタイルの採用)の点でどのように比較されますか?私は生産経験がありませんので、私はこれまで暴露されてきたアルゴリズムの課題を孤立させるのではなく、実際の慣習を知りたいと思っています。 – jpls93

+0

@JohnそれはES6がネイティブであるか、または蒸散されたかによって異なります。私はソースコードが全体的に約25〜30%短くなる傾向があることを伝えています。実世界での実践では、AFAIK ES 6/BabelまたはTypescript(これは、バーベルと同じcore-js transpilerを使用します)はかなり標準的です。パーフォーマンスに関しては、私はそれをプロファイリングしていませんが、ホットループに入っていなければ、大小の違いがあっても問題ではありません。 –

+0

概要:http://stackoverflow.com/a/38664372/747579 –

関連する問題