2016-11-07 1 views
0

다음과 같은 스트림이 있는데 나는 true (부울) 인 params 만 필터링하고 유지하려고합니다. 여기RxJS가있는 객체의 객체 객체

{ 
    "colors": ["yellow"], 
    "size": ["t5,t20"] 
} 

내 thougt 있습니다 나는이 처리하려고 할 때 :

{ 
    "colors": { 
    "red": "", 
    "yellow": true, 
    "green": false 
    }, 
    "size": { 
    "t5": true, 
    "t10": "", 
    "t20": true 
    } 
} 

내가 같이하는 출력을 필요로 내가지도를 사용하려고

  • 하지만, 성공없이. 그것이 객체이고 배열이 아니기 때문에 그럴 것 같습니다.
  • 모든 키와 값은이 개체에서 동적이므로 개체를 조작하는 데 사용할 수 없습니다.
  • flatMap() 조금 도와 줘야하지만 내가 그걸로 무엇을 해야할지 모르겠다. 나는 키의 이름을 모른다.
this.form.valueChanges 
    .debounceTime(400) 
    .flatMap(x => Object.values(x)) 
    .subscribe(console.log) 

답변

2

이는 rxjs 문제, 그냥 일반 JS 매핑되지 않습니다 :

getTruthyKeys(obj: any): Array<string> { 
    return Object.keys(obj).filter(key => obj[key] === true); 
} 

mainKeysToTruthyLists(obj: any): Array<{key: string, truthy: Array<string>}> { 
    let result = {}; 
    Object.keys(obj).forEach(key => result[key] = getTruthyKeys(obj[key]); 
    return result; 
} 

지금 당신은 당신의 스트림에지도로 적용 할 수 있습니다

this.form.valueChanges 
    .debounceTime(400) 
    .map(mainKeysToTruthyLists) 
    .subscribe(console.log) 
+1

mainKeysToTruthyLists 함수에서 리턴 값을 추가 한 후에 작동합니다. 또한 조인 (',')을 추가했습니다. 나는 네 스타일이 좋아. 이것은 정말로 도움이되었습니다. 고맙습니다. – Tom

2

이를 RxJS 질문이 아닙니다. RxJS가해야 할 일은 모두 map입니다. Object.entries으로 수행 할 수 있습니다.

this.form.valueChanges 
.debounceTime(400) 
.map(obj => { 
    return Object.entries(obj) 
    .reduce((newObj, [key, subObj]) => { 
    const subArr = Object.entries(subObj) 
    .filter(([, subValue]) => subValue) 
    .map(([subKey]) => subKey); 

    return Object.assign(newObj, { [key]: subArr }); 
    }, {}) 
})