2016-11-07 127 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 }); 
    }, {}) 
})