You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:37:18