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

如何将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

代码对应说明

  1. 分组操作:Ruby的group_by方法直接实现按指定字段分组,和Lodash的_.groupBy逻辑完全匹配
  2. 去重操作:通过map提取所有type值后调用uniq去重,替代JS中Set的实现逻辑
  3. 存在性验证:Ruby的find方法和JS的find行为一致,返回第一个符合条件的元素(无符合元素时返回nil)
  4. 排序操作:sort_by方法更简洁直观,按v1字段完成升序排列,等价于JS的自定义排序函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:35:33