Ruby数组多条件筛选优化:支持单/组合参数查询
解决Ruby数组多参数可选筛选的简洁方案
搞定这个多参数筛选的问题很简单,咱们来一步步捋清楚!你之前的代码报错是因为没给参数设置默认值,导致单独传某个参数时,其他参数变成未定义的局部变量。而且要实现灵活的单/组合筛选,关键是动态构建筛选条件,同时满足你特定的返回规则。
核心思路
根据你的需求,我们可以把规则提炼为:
- 只要传入了
name参数(不管是单独传,还是和hair/weight组合),就按传入的所有非空参数筛选匹配的元素; - 如果只传
hair或weight(没传name),直接返回整个数组。
简洁实现代码
我们可以用Ruby的keyword参数+哈希方法来实现,完全没有重复代码:
def filter_people(people, name: nil, hair: nil, weight: nil) # 收集所有非空的筛选条件 filters = { name: name, hair: hair, weight: weight }.compact # 判断是否包含name筛选条件 if filters.key?(:name) # 筛选出满足所有非空条件的元素 people.select { |person| filters.all? { |key, value| person[key] == value } } else # 没传name,直接返回原数组 people end end
代码解释
- 参数默认值:给
name/hair/weight都设置nil作为默认值,避免未定义变量的错误; - 筛选条件压缩:用
compact去掉哈希中值为nil的键,得到实际传入的有效筛选条件; - 动态筛选:用
all?方法检查每个元素是否满足所有有效筛选条件,灵活支持任意包含name的组合; - 规则处理:如果筛选条件里没有
name,直接返回整个数组,符合你的场景2需求。
调用示例
用你的person数组来测试:
person = [ {name: 'bob', weight: '160 lbs', hair: 'brown'}, {name: 'bob', weight: '160 lbs', hair: 'brown'}, {name: 'bob1', weight: '160 lbs', hair: 'brown'}, {name: 'bob1', weight: '160 lbs', hair: 'brown'}, {name: 'bob1', weight: '160 lbs', hair: 'brown'} ] # 场景1:同时传name和hair,返回匹配的前两个/后三个 filter_people(person, name: 'bob', hair: 'brown') filter_people(person, name: 'bob1', hair: 'brown') # 场景2:仅传hair/weight,返回整个数组 filter_people(person, hair: 'brown') filter_people(person, weight: '160 lbs') # 额外场景:单独传name,返回匹配name的元素 filter_people(person, name: 'bob') # 额外场景:组合name+weight,返回匹配的元素 filter_people(person, name: 'bob1', weight: '160 lbs')
这个方案既满足了你所有的需求,又非常灵活,后续要加新的筛选字段也只需要在参数里加就行,不用改核心逻辑~
内容的提问来源于stack exchange,提问作者jose1221
相关产品推荐
相关产品推荐

