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

Ramda:如何基于动态键过滤对象中的items数组

使用Ramda根据动态键过滤数组

需求说明

给定如下数据结构:

const data = {
  "avaiable_items": {"1": [201259, 201303],"2": [201303], "3": [201259]},
  "items": [{"id": "201259","name": "ABC"},{"id": "201303","name": "DEF"}]
};

需要根据avaiable_items中的动态键(比如"1"),过滤出items数组中id存在于对应值数组内的项,最终返回{ item: [...] }格式的结果。

实现代码

const R = require('ramda');

// 生成过滤函数:传入目标键,返回处理data的函数
const filterItemsByKey = (targetKey) => R.pipe(
  // 提取目标键对应的id数组,处理键不存在的情况
  R.path(['avaiable_items', targetKey]),
  R.defaultTo([]),
  // 转字符串匹配items中的id类型
  R.map(String),
  // 过滤items数组
  (allowedIds) => R.filter(
    R.propSatisfies(R.flip(R.contains)(allowedIds), 'id'),
    R.prop('items')
  ),
  // 包装为要求的输出结构
  R.objOf('item')
);

// 测试示例
console.log(filterItemsByKey('1')(data));
// 输出:{ item: [ { id: '201259', name: 'ABC' }, { id: '201303', name: 'DEF' } ] }

console.log(filterItemsByKey('2')(data));
// 输出:{ item: [ { id: '201303', name: 'DEF' } ] }

console.log(filterItemsByKey('4')(data));
// 输出:{ item: [] }

代码解析

  1. 提取允许的ID列表:用R.path从data中取出指定键对应的ID数组,R.defaultTo([])处理键不存在的边界情况,R.map(String)将数字ID转为字符串,和items中的ID类型统一。
  2. 过滤items数组:通过R.filter结合R.propSatisfies,检查每个item的id是否在允许列表中;R.flip(R.contains)(allowedIds)反转参数顺序,适配propSatisfies的回调格式。
  3. 包装输出结构:用R.objOf('item')把过滤后的数组包装成要求的对象格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:25:23