如何用Ramda实现移除对象中含另一对象键值的元素?
用Ramda重构Mediator频道移除逻辑
我是Ramda新手,正在构建一个mediator类,现有一个描述已注册(授权)频道/消息的对象,该对象的键和值均需保持唯一。注册时的传入方式如下:
enum MyMessages { FirstMessage = 'first:message', SecondMessage = 'second:message' }; mediator.addChannels(MyMessages); // 带有验证器以确保唯一性。
调用mediator.removeChannels(MyMessages);可移除频道,目前的命令式实现运行正常:
// 浅克隆现有频道。 let result = { ...existingChannels }; // 遍历待移除的频道。 for (const [key, value] of Object.entries(channelsToRemove)) { // 键匹配。 if (Object.keys(result).includes(key)) { delete result[key]; } // 值匹配。 if (Object.values(result).includes(value)) { // 查找对应值的键。 const k = Object.keys(result).find((a: string) => result[a] === value); if (k) { delete result[k]; } } // 待移除频道的值匹配现有键。 if (Object.keys(result).includes(value as string)) { delete result[value as string]; } // 待移除频道的键匹配现有值。 if (Object.values(result).includes(key)) { const k = Object.keys(result).find((a: string) => result[a] === key); if (k) { delete result[k]; } } } return result;
这个实现虽可优化,但能正确得到移除指定键/值后的channels对象。我希望用Ramda函数替代这段代码,目前已能通过R.without(R.keys(channelsToRemove), R.keys(existingChannels))获取重叠键,但不知如何轻松得到最终目标对象(即不含另一对象键或值的对象)。
示例对象
const obj1 = { foo: 'bar', baz: 'sum' } const obj2 = { baz: 'hop' } const obj3 = { sum: 'ack' }
期望结果
obj1 - obj2应返回{ foo: 'bar' }:键与键重叠。obj1 - obj3应返回{ foo: 'bar' }:键与值重叠。obj2 - obj3应返回{ baz: 'hop' }:键值均唯一。
内容的提问来源于stack exchange,提问作者Benoît Lahoz
相关产品推荐
相关产品推荐

