2017-02-08 8 views
1

object array私はそれを述語と照合してデータをフィルタリングしたいと思います。複雑さは、predicateの構成にあり、この場合、Mapデータ構造を使用して構築されたqueryのものに似ています。ここで述語角度2のフィルタ配列

は、オブジェクトの私のarrayは、次のようになります。

var map = new Map<string, any>(); 
map.set("name", ["henry", "bob"]); 
map.set("status", "active"); 

この場合、正しい出力すべきである:ここで

var data = [ 
    {"id" : 1, "name": "bob", "address": "123 abc", "status": "active"}, 
    {"id" : 2, "name": "henry", "address": "123 def", "status": "inactive"}, 
    {"id" : 3, "name": "henry", "address": "123 hij", "status": "active"} 
]; 

は `述語が構築されるべきものとはMap構造は、あります次のとおりです。

[{"id" : 3, "name": "henry", "address": "123 hij", "status": "active"}] 

私のdata.filter((item) => {...})ルーチンを使用して、predicateを動的に構築し、結果をフィルタリングします。私はpropertyの名前をハードコードすることは望ましくありません。なぜなら、フィルタリングするプロパティのいずれかになる可能性があるからです。

第2に、値はtype anyであり、これはstring,arrayまたは数値であることができることを意味します。私は、述語にMapオブジェクトを平らにする方法を見つけ出す、その後、必要に応じてフィルタリングすることができません

data.filter((item) => 
{ item["name"] IS IN map.get("name").values[] 
    && item["status"] IS EQUAL TO map.get("status").value)}); 

:述語は、これに似たものと評価されます。どんな手がかりや助けが本当に役に立つでしょう。

答えて

1

かなりラフで準備ができていますが、以下のようなものが正しい軌道に乗るかもしれません(あなたの単純なデータセットのために働くかもしれません)。

const predicate = item => { 
    for (let [key, value] of map) { 
    if (!item.hasOwnProperty(key)) return false; 
    if (typeof value === 'number') { 
     if (item[key] !== value) return false; 
    } 
    if (!value.includes(item[key])) return false; 
    } 
    return true; 
}; 
+0

これはうまくいくように見えますが、私は「for」を使用できません。代わりに「foreach」が働いています。しかし、 'foreach'の短絡を防ぐことはできません。 – faizanjehangir

+0

' forEach'ではなく 'for'ループを使うのはなぜですか? – Lee

+0

すべての 'keys()と.entries()'が動作しmap iterableを返す 'es5'と' map'データ型を使用していますが、forループでどのように反復することをお勧めしますか? – faizanjehangir

関連する問題