RxJS对象的过滤器对象
问题描述:
我有以下流,我想过滤并只保留是真(布尔)的参数。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)
答
这不是一个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)
答
这并不是真正的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 });
}, {})
})
它在我在mainKeysToTruthyLists函数中添加一个返回值后工作。我还加入了一个连接(',')。我喜欢你的风格。这真的很有帮助。谢谢。 – Tom