首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重构:循环从嵌套数组中检索元素

重构:循环从嵌套数组中检索元素
EN

Stack Overflow用户
提问于 2016-01-05 16:19:38
回答 5查看 500关注 0票数 2

我需要检查一个散列数组,每个散列包含一个标签和一个数据数组。最终结果将是一个连接的字符串,首先是label,然后是对应于该标签的数据。

散列的输入数组如下所示:

[{label: "first", data: [1, 2]}, {label: "second", data: [3, 4, 5]}, {label: "third", data: []}, {label: "fourth", data: [6]}]

在这个例子中,max_returns应该是很高的,比如:10

代码语言:javascript
运行
复制
def round_robin(arr, max_returns)
  result = ''
  i = 0 # number of grabbed elements
  j = 0 # inner array position
  k = 0 # outer array position
  l = 0 # number of times inner array length has been exceeded
  while i < max_returns do
    if k >= arr.length
      j += 1
      k = 0
    end
    element = arr[k]
    if element[:data].empty?
      k += 1
      next
    end

    if j >= element[:data].length
      l += 1
      k += 1

      if l > arr.length && i < max_returns
        break
      end
      next
    end
    result += element[:label] + ': ' + element[:data][j].to_s + ', '
    i += 1
    k += 1
  end
  result
end

根据上述投入,产出应是:

"first: 1, second: 3, fourth: 6, first: 2, second: 4, second: 5"

另外:max_returns是检索结果总数的最大数目。因此,如果我的示例有一个max_returns = 3,那么输出应该是:

"first: 1, second: 3, fourth: 6"

问题:是否有更好或更有效的方法从多个数组中以循环方式获取数据?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-05 22:58:25

这样做是可行的:

代码语言:javascript
运行
复制
arr = [{ label: "first",  data: [1, 3] },
       { label: "second", data: [3, 4, 5] },
       { label: "third",  data: [] },
       { label: "fourth", data: [6] }]

results = []
arr.each do |h|
  h[:data].each_with_index do |d, i|
    results[i] ||= []
    results[i] << "#{h[:label]}: #{d}"
  end
end

results.flatten.join(', ')
#=> "first: 1, second: 3, fourth: 6, first: 3, second: 4, second: 5"
票数 3
EN

Stack Overflow用户

发布于 2016-01-05 16:53:35

代码语言:javascript
运行
复制
▶ input = [{label: "first", data: [1, 2]},
           {label: "second", data: [3, 4, 5]},
           {label: "third", data: []},
           {label: "fourth", data: [6]}]

▶ max = input.max_by { |e| e[:data].size }[:data].size

▶ input.map do |h|
    [[h[:label]] * max].flatten.zip h[:data] # make it N×M (for transpose)
  end.transpose.map do |e|
    e.reject { |_, v| v.nil? }               # remove nils
  end.flatten(1).map { |e| e.join ': ' }.join ', '

#⇒  "first: 1, second: 3, fourth: 6, first: 2, second: 4, second: 5"

如果没有最后两个联接,结果将是一个数组数组:

代码语言:javascript
运行
复制
#⇒ [["first", 1], ["second", 3], ["fourth", 6], 
#   ["first", 2], ["second", 4], ["second", 5]]
票数 3
EN

Stack Overflow用户

发布于 2016-01-05 18:16:39

代码语言:javascript
运行
复制
arr = [{ label: "first",  data: [1, 2] },
       { label: "second", data: [3, 4, 5] },
       { label: "third",  data: [] },
       { label: "fourth", data: [6] }]

labels, data = arr.map { |h| [h[:label], h[:data].dup] }.transpose
  #=> [["first", "second", "third", "fourth"], [[1, 2], [3, 4, 5], [], [6]]] 
data.map(&:size).max.times.with_object([]) do |_,arr|
  labels.each_index do |i|
    d = data[i].shift
    arr << "#{labels[i]}: #{d}" if d
  end
end.join(', ')
  #=> "first: 1, second: 3, fourth: 6, first: 2, second: 4, second: 5"  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34616351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档