【问题标题】:Sorting by integers represented as strings按表示为字符串的整数排序
【发布时间】:2018-07-14 12:21:56
【问题描述】:

我想按相关对象的属性值对 ActiveRecord 对象数组进行排序。意思是这样的:
项目有一个具有属性 SKU 的产品。 SKU 主要是存储为字符串的整数,但也可以是字母数字。

sorted = items.sort_by { |item| Integer(item.product.sku) } rescue items

目前,如果出现错误,原始订单的商品将退回。
我想做什么?
扩展 Array 类以实现类似:

items.numeric_sort { |item| item.product.sku }

到目前为止我做了什么?
1.构建一个lambda表达式并传递它

class Array
  def numeric_sort(&lambda)
    if lambda.respond_to? :call
      self.sort_by(&lambda) rescue self
    else
      self.sort_by { |el| Integer(el) } rescue self
    end
  end
end

product_bin = lambda { |task_item| Integer(item.product.bin) }  
items.numeric_sort(&product_bin)

2。从方法链构建 lambda 表达式

class Object
  def send_chain(keys)
    keys.inject(self, :send)
  end
end

class Array
  def numeric_sort_by(*args)
    (args.length == 1) ? lam = lambda {|el| Integer(el.send(args))} : lam = lambda {|el| Integer(el.send_chain(args))}
    self.sort_by(&lam) rescue self
  end
end

items.numeric_sort_by(:product, :sku)

这一切有意义吗?
如果可能的话,能否请您指出正确的方向来实现我上面提到的语法。
谢谢。

编辑:sku 也可以是字母数字。很抱歉造成混乱。

【问题讨论】:

  • 关闭,但我想要一个热门的建议来实现所需的语法。谢谢。
  • 你能提供一个items 数据样本吗?
  • @iGian items = [ {id: 1, product: {sku: "6234324"}, {id: 2, product: {sku: "342343}}] .. 实际上这些是 AR对象不是哈希。
  • 为什么不items.sort_by { |item| item.product.sku.to_i }?如果 sku 不是有效的整数字符串,则不会失败。

标签: ruby-on-rails arrays ruby sorting


【解决方案1】:

试试这个解决方案。

没有错误处理。 如果你喜欢,这只是一个开发的想法。

class Array
  def numeric_sort_by(*args)
    self.sort_by do |element|
      object = element
      args.size.times { |n| object = object.send(args[n]) }
      object.to_f
    end
  end
end

items.numeric_sort_by 'product', 'sku'

【讨论】:

  • 谢谢,但你实现了和我一样的想法,只是没有打开对象。我想: items.numeric_sort { |item| item.product.sku } 如果可能的话。
【解决方案2】:

所以简单的实现是:

sorted = items.sort_by { |item| Integer(item.product.sku) } rescue items

而想要的是:

items.numeric_sort_by { |item| item.product.sku }

我设法通过在 sort_by 中产生一个块来实现它:

class Array
  def numeric_sort_by(&block)
    return to_enum :numeric_sort_by unless block_given?
    self.sort_by { |element| Integer(yield(element)) } rescue self
  end
end

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 2023-03-26
    • 2014-04-21
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多