gpt4 book ai didi

Ruby:按属性值链接两个对象数组

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:42 25 4
gpt4 key购买 nike

我是 Ruby 编程的新手。在 Ruby 中,有很多方法可以编写优雅的代码。有什么优雅的方法可以通过属性值将两个数组与相同类型的对象链接起来吗?

这很难解释。让我们看下一个例子:

a = [ { :id => 1, :value => 1 }, { :id => 2, :value => 2 }, { :id => 3, :value => 3 } ]
b = [ { :id => 1, :value => 2 }, { :id => 3, :value => 4 } ]
c = link a, b

# Result structure after linkage.
c = {
"1" => {
:a => { :id => 1, :value => 1 },
:b => { :id => 1, :value => 1 }
},
"3" => {
:a => { :id => 3, :value => 3 },
:b => { :id => 3, :value => 4 }
}
}

所以基本的想法是从不同的数组中通过它们的公共(public) ID 获取成对的对象并构造一个散列,这将通过 ID 给出这对对象。

提前致谢。

最佳答案

如果你想通过 Enumerable 进行一次冒险,你可以这样说:

(a.map { |h| [:a, h] } + b.map { |h| [:b, h] })
.group_by { |_, h| h[:id] }
.select { |_, a| a.length == 2 }
.inject({}) { |h, (n, v)| h.update(n => Hash[v]) }

如果您真的希望键是字符串,请说 n.to_s => Hash[v] 而不是 n => Hash[v]

逻辑是这样的:

  1. 我们需要知道所有内容的来源,我们用 :a:b 符号装饰小散列以追踪它们的来源。
  2. 然后将装饰数组一起添加到一个列表中,以便...
  3. group_by可以将事物分组为几乎最终的格式。
  4. 然后找到大小为 2 的组,因为这些组包含同时出现在 ab 中的条目。大小为 1 的组仅出现在 ab 之一中,因此我们将其丢弃。
  5. 然后一点inject ionic 将事物重新排列成最终格式。请注意,我们在 (1) 中构建的数组恰好采用 Hash[] 的格式。正在寻找。

如果您想在 link 方法中执行此操作,那么您需要这样说:

link :a => a, :b => b

这样该方法就会知道调用什么 ab。这个假设的 link 方法也很容易推广到更多数组:

def link(input)
input.map { |k, v| v.map { |h| [k, h] } }
.inject(:+)
.group_by { |_, h| h[:id] }
.select { |_, a| a.length == input.length }
.inject({}) { |h, (n, v)| h.update(n => Hash[v]) }
end

link :a => [...], :b => [...], :c => [...]

关于Ruby:按属性值链接两个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21292956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com