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

如何使用Ramda按id判断对象数组是否为另一数组子集并修复实现报错

现有代码问题分析
  • Ramda的compose执行顺序是从右到左,你在compose中提前给filter传入了arr参数,导致filter直接执行返回数组而非可调用函数,运行时尝试调用数组就会抛出g.call is not a function的类型错误。
  • 逻辑上你误用了identity,propEq('id', identity)是判断元素id是否等于Ramda的identity函数本身,完全取不到当前遍历元素的id值做匹配。
  • 函数导出名和调用名不匹配,你导出的函数叫isSubset,调用时用的是isSubsetOfInputIdentifiers,属于低级拼写错误。
正确Ramda实现

基础版(对齐原生逻辑)

import { all, pipe, prop, includes, pluck } from 'ramda';

export const isSubsetOfInputIdentifiers = (arr2) => {
  // 提前提取arr2所有id组成数组
  const arr2Ids = pluck('id', arr2);
  // 对应原生every,判断arr1所有元素id都在arr2Ids中
  return all(
    pipe(
      prop('id'),
      id => includes(id, arr2Ids)
    )
  )
}

// 调用方式和你预期一致
const result = isSubsetOfInputIdentifiers(arr2)(arr1)

优化版(适配大数据量)

如果arr2数据量较大,建议先把id转成Set降低查询时间复杂度:

import { all, pipe, prop, includes, pluck } from 'ramda';

export const isSubsetOfInputIdentifiers = (arr2) => {
  const arr2IdSet = new Set(pluck('id', arr2));
  return all(
    pipe(
      prop('id'),
      id => includes(id, arr2IdSet)
    )
  )
}

内容的提问来源于stack exchange,提问作者Kamya Kashyap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:00:01