如何使用Ramda根据数组中的值过滤对象集合?
使用Ramda筛选符合type条件的对象集合
这问题我熟,用Ramda来处理这类筛选需求特别顺手,给你两种实用的方案,都能得到你想要的结果:
基础方案(适合小数据量)
直接用Ramda的filter、pipe、prop和contains组合就能搞定,代码简洁直观:
const array = [1, 2, 4]; const collection = [ { type: 1, eyes: 'blue'}, { type: 2, eyes: 'brown'}, { type: 3, eyes: 'green'}, { type: 4, eyes: 'blue'} ]; // 组合筛选函数 const filterValidTypes = R.filter( R.pipe( R.prop('type'), // 提取对象的type属性值 R.contains(R.__, array) // 判断该值是否在目标数组中,R.__是占位符 ) ); // 执行筛选 const result = filterValidTypes(collection); console.log(result); // 输出:[ { type: 1, eyes: 'blue'}, { type: 2, eyes: 'brown'}, { type: 4, eyes: 'blue'} ]
性能优化方案(适合大数据量)
如果你的array或者collection数据量很大,建议先把数组转成Set——因为Set的查找是O(1)时间复杂度,比数组的O(n)高效很多:
const array = [1, 2, 4]; const collection = [ { type: 1, eyes: 'blue'}, { type: 2, eyes: 'brown'}, { type: 3, eyes: 'green'}, { type: 4, eyes: 'blue'} ]; // 先把目标数组转成Set const validTypesSet = new Set(array); // 组合筛选函数,用includes替代contains(支持Set) const filterValidTypes = R.filter( R.pipe( R.prop('type'), R.includes(R.__, validTypesSet) ) ); const result = filterValidTypes(collection); console.log(result); // 输出和上面一致
关键函数解释
R.prop('type'):从每个对象中精准提取type属性的值R.pipe(fn1, fn2):把多个函数按顺序组合,前一个函数的输出作为后一个的输入R.contains/R.includes:判断值是否存在于目标集合中,includes是Ramda v0.27+新增的,支持Set和数组,比contains更灵活
内容的提问来源于stack exchange,提问作者Max Phillips
相关产品推荐
相关产品推荐

