2016-11-07 5 views
0

私は以下のストリームを持っています。真(ブール値)のパラメータだけをフィルタリングして保持したいと思います。RxJSを使ったオブジェクトのフィルタオブジェクト

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

私は、出力は次のようになりする必要があります。ここでは

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

私はこの問題に対処しようとすると、私のthougtです:

  • 私はマップを使用しようとしたが、成功なし。私はそれが オブジェクトであり、配列ではないからだと思います。
  • すべてのキーと値はこのオブジェクトでは動的なので、私はそれらを使用して オブジェクトを操作することはできません。
  • 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 }); 
    }, {}) 
}) 
関連する問題