如何使用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
相关产品推荐
相关产品推荐

