Ruby -在对象数组中的重复字段后添加增量数字[已关闭]

0h4hbjxa  于 2023-02-12  发布在  Ruby
关注(0)|答案(3)|浏览(177)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

两年前关闭了。
这篇文章是编辑和提交审查2天前。
Improve this question
数组中有重复的项--我想给这些项追加一个递增的数字。例如:
输入:

[
  {id: 1, name: "john"},
  {id: 2, name: "Man"},
  {id: 3, name: "Man"},
  {id: 4, name: "john"},
  {id: 5, name: "kind"},
  {id: 6, name: "nova"},
  {id: 7, name: "kind"},
  {id: 8, name: "fred"},
  {id: 9, name: "fred"},
  {id: 10, name: "john"}
]

预期产出:

[
  {id: 1, name: "john-1"},
  {id: 2, name: "Man-1"},
  {id: 3, name: "Man-2"},
  {id: 4, name: "john-2"},
  {id: 5, name: "kind-1"},
  {id: 6, name: "nova"},
  {id: 7, name: "kind-2"},
  {id: 8, name: "fred"},
  {id: 9, name: "monk"},
  {id: 10, name: "john-3"}
]
igsr9ssn

igsr9ssn1#

输入数据可能非常庞大,是否有任何方法可以改变同一对象并只查找重复项以减少延迟和内存
类似这样的事情会起作用:

input
  .group_by { |item| item[:name] }
  .reject { |_name, entries| entries.count == 1 }
  .each do |_name, entries|
    entries.each.with_index(1) do |entry, index|
      entry[:name] << "-#{index}"
    end
  end

它根据:name键对条目进行分组,并拒绝那些只有1个条目的条目,然后遍历剩余的组(即有2个或更多条目的组),并在每个条目的名称后附加一个基于1的索引。
之后,input将为:

[{:id=>1, :name=>"john-1"},
 {:id=>2, :name=>"Man-1"},
 {:id=>3, :name=>"Man-2"},
 {:id=>4, :name=>"john-2"},
 {:id=>5, :name=>"kind-1"},
 {:id=>6, :name=>"nova"},
 {:id=>7, :name=>"kind-2"},
 {:id=>8, :name=>"fred-1"},
 {:id=>9, :name=>"fred-2"},
 {:id=>10, :name=>"john-3"}]
83qze16e

83qze16e2#

这是一个给定输入的快速示例:

input
  .group_by { |value| value[:name] }
  .values
  .select { |x| x.map.with_index(1) { |y, i| p y[:name] = "#{y[:name]}-#{i}" } }
  .flatten

这就是输出:

[{:id=>1, :name=>"john-1"},
 {:id=>4, :name=>"john-2"},
 {:id=>10, :name=>"john-3"},
 {:id=>2, :name=>"Man-1"},
 {:id=>3, :name=>"Man-2"},
 {:id=>5, :name=>"kind-1"},
 {:id=>7, :name=>"kind-2"},
 {:id=>6, :name=>"nova-1"},
 {:id=>8, :name=>"fred-1"},
 {:id=>9, :name=>"fred-2"}]

Group by将重复的名字分组输入。我不知道你是否尝试过,但这是你可以开始工作和改进的东西。

j8yoct9x

j8yoct9x3#

尝试改变相同的输入并递增名称字符串中的值

orders = [{:id=>2, :name=>"Man"}, {:id=>3, :name=>"Man"}, {:id=>8, :name=>"fred"}, {:id=>9, :name=>"fred"},{:id=>5, :name=>"kindaa"}, {:id=>1, :name=>"john"}, {:id=>4, :name=>"john"}, {:id=>10, :name=>"john"}, {:id=>5, :name=>"kinda"}, {:id=>5, :name=>"kind"}, {:id=>7, :name=>"kind"}, {:id=>6, :name=>"nova"}, {:id=>11, :name=>"nova"}] 
    counter = 1
    orders.each_with_index do |order, index|
    if index < orders.length - 1
    if order[:name] == orders[index + 1][:name]
      orders[index][:name] = orders[index][:name].to_s + "-#{counter}"
      counter = counter + 1
    else
      orders[index][:name] = orders[index][:name].to_s + "-#{counter}" if counter > 1
      counter = 1
    end
    else
      orders[index][:name] = orders[index][:name].to_s + "-#{counter}" if counter > 1
    end
    end
    puts orders

输出:

{:id=>2, :name=>"Man-1"}
{:id=>3, :name=>"Man-2"}
{:id=>8, :name=>"fred-1"}
{:id=>9, :name=>"fred-2"}
{:id=>5, :name=>"kindaa"}
{:id=>1, :name=>"john-1"}
{:id=>4, :name=>"john-2"}
{:id=>10, :name=>"john-3"}
{:id=>5, :name=>"kinda"}
{:id=>5, :name=>"kind-1"}
{:id=>7, :name=>"kind-2"}
{:id=>6, :name=>"nova-1"}
{:id=>11, :name=>"nova-2"}

相关问题