2017-02-08 2 views
1

object array에 술어와 일치시켜 데이터를 필터링하려고합니다. 복잡성은 predicate의 구성에 있으며이 경우에는 Map 데이터 구조를 사용하여 빌드 된 query의 것과 유사합니다.술어 각도 2의 필터 배열

다음
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 구조입니다 : 여기

처럼 내 개체의 array는 모습입니다

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

이 경우 올바른 출력해야 be :

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

이제 어떻게 작성해야합니까? 내 data.filter((item) => {...}) 루틴을 사용하여 동적으로 predicate을 구성하고 결과를 필터링합니다. 필터링 할 속성 중 하나 일 수 있으므로 property 이름을 하드 코드하고 싶지 않습니다.

둘째 값은 type any이며, 이는 , 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 of'를 사용할 수 없지만 'foreach'가 작동합니다. 그러나'foreach'에서 단락 회로가 생기지 않습니다 .. – faizanjehangir

+0

'forEach' 대신에'for' 루프를 사용하지 않으시겠습니까? – Lee

+0

'keys()와 .entries()'가 작동하고 map iterable을 반환하는'es5'와'map' 데이터 유형을 사용하고 있습니다. for 루프에서 반복 할 것을 어떻게 제안합니까? – faizanjehangir