如何将JS中的sort、find、Set相关函数转换为Ruby on Rails代码?
JavaScript转Ruby on Rails实现数组分组、去重、验证及排序功能
需求说明
- 按
type字段对对象数组进行分组 - 提取不重复的
type值 - 针对每个分组,验证是否存在
v1 ≥ v2的元素 - 按
v1字段对分组内元素进行升序排序
原JavaScript代码
const sections = [{ "type": "A", "v1": 1002, "v2": 1001 }, { "type": "A", "v1": 1700, "v2": 1900 }, { "type": "A", "v1": 1100, "v2": 1200 }, { "type": "B", "v1": 1000, "v2": 1700 }] var sections_b = _.groupBy(sections, (n) => n.type); const withoutRepetitions = [...new Set(sections.map(e => e.type))] for (w of withoutRepetitions) { c = sections_b[w] const isOk = c.find((ele) => ele['v1'] >= ele['v2']) let sortedArray = c.sort((a, b) => a['v1'] - b['v1']) console.log('sortedArray', sortedArray) }
Ruby on Rails实现代码
Ruby的Enumerable模块自带便捷方法,无需额外依赖即可实现完全一致的逻辑:
sections = [ { type: "A", v1: 1002, v2: 1001 }, { type: "A", v1: 1700, v2: 1900 }, { type: "A", v1: 1100, v2: 1200 }, { type: "B", v1: 1000, v2: 1700 } ] # 按type分组,对应JS的_.groupBy sections_b = sections.group_by { |section| section[:type] } # 提取不重复的type值,对应JS的Set去重逻辑 without_repetitions = sections.map { |s| s[:type] }.uniq without_repetitions.each do |type| group = sections_b[type] # 验证分组内是否存在v1≥v2的元素,对应JS的find方法 is_ok = group.find { |ele| ele[:v1] >= ele[:v2] } # 按v1升序排序,对应JS的自定义sort逻辑 sorted_array = group.sort_by { |ele| ele[:v1] } puts "sortedArray: #{sorted_array}" end
代码对应说明
- 分组操作:Ruby的
group_by方法直接实现按指定字段分组,和Lodash的_.groupBy逻辑完全匹配 - 去重操作:通过
map提取所有type值后调用uniq去重,替代JS中Set的实现逻辑 - 存在性验证:Ruby的
find方法和JS的find行为一致,返回第一个符合条件的元素(无符合元素时返回nil) - 排序操作:
sort_by方法更简洁直观,按v1字段完成升序排列,等价于JS的自定义排序函数
内容的提问来源于stack exchange,提问作者register
相关产品推荐
相关产品推荐

