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