gpt4 book ai didi

ruby-on-rails - 将哈希深度转换为平面路径数组

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:11 25 4
gpt4 key购买 nike

我想获得有关如何像这样转换不同结构的提示和示例:

h = {
friend: [:id, :name],
meta: {
board: [:id, :name],
column: [:id, :name, users: [:id, :name]]
},
trello: [:id, :name]
}

像这样进入数组:

[[:friend, :id],
[:friend, :name],
[:meta, :board, :id],
[:meta, :board, :name],
[:meta, :column, :id],
[:meta, :column, :name],
[:meta, :column, :users, :id],
[:meta, :column, :users, :name],
[:trello, :id],
[:trello, :name]]

这个数组的每个元素都是一个完整的路径。

最佳答案

非常标准Tree traversal problem .你可以使用 DFS通过递归:

# for Array.wrap; It's needed in pure ruby script, not in Rails
require 'active_support/all'

def deep_flatten(tree, path, result)
tree.each do |key, value|
Array.wrap(value).each do |e|
if e.is_a? Hash
deep_flatten(e, path + [key], result)
else
result << path + [key, e]
end
end
end
end

tree = {
friend: [:id, :name],
meta: {
board: [:id, :name],
column: [:id, :name, users: [:id, :name]]
},
trello: [:id, :name]
}

result = []
deep_flatten(tree, [], result)
result.each do |line|
puts line.inspect
end

输出:

[:friend, :id]
[:friend, :name]
[:meta, :board, :id]
[:meta, :board, :name]
[:meta, :column, :id]
[:meta, :column, :name]
[:meta, :column, :users, :id]
[:meta, :column, :users, :name]
[:trello, :id]
[:trello, :name]

Array.wrap

关于ruby-on-rails - 将哈希深度转换为平面路径数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56995221/

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