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: [] }
代码解析
- 提取允许的ID列表:用
R.path从data中取出指定键对应的ID数组,R.defaultTo([])处理键不存在的边界情况,R.map(String)将数字ID转为字符串,和items中的ID类型统一。 - 过滤items数组:通过
R.filter结合R.propSatisfies,检查每个item的id是否在允许列表中;R.flip(R.contains)(allowedIds)反转参数顺序,适配propSatisfies的回调格式。 - 包装输出结构:用
R.objOf('item')把过滤后的数组包装成要求的对象格式。
内容的提问来源于stack exchange,提问作者Maddy
相关产品推荐
相关产品推荐

