首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2016-01-05 16:50:49

我不知道什么是圆形知更鸟,但以下是给出您需要的输出的解决方案:

基于初始数组元素删除的版本:

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

loop do
  arr.each do |hash|                               # go through each hash
    num = hash[:data].delete_at(0)                 # remove first element in data array
    puts "#{hash[:label]}: #{num}" unless num.nil? # output it if it's not nil(means array was empty)
  end
  break if arr.map { |i| i[:data] }.flatten == []  # stop if all arrays are empty
end

不改变初始数组的版本:

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

max_data_size = arr.map { |i| i[:data] }.map(&:size).max
loop.with_index do |_, i|
  arr.each do |hash|
    num = hash[:data][i]
    puts "#{hash[:label]}: #{num}" unless num.nil?
  end
  break if i >= max_data_size - 1
end
票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34616351

复制
相关文章

相似问题

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