【问题标题】:Comparing two arrays and combining them Ruby比较两个数组并将它们组合 Ruby
【发布时间】:2017-02-15 12:41:19
【问题描述】:

我有两个数组

arr1 = [[["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], ["species", "Alex"], ["female", "yes"], ["group"]], [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], ["species", "cat"], ["female", "no"], ["group"]]]

arr2 = [["A23", "All", "Katy", "Max"], ["B23", "Sisi", "Alex"]]

如果是名称,例如。来自 arr2 的值 Alex 就像来自 arr1 的值 Alex,来自 arr2 的值 B23 被推送到子数组 ["group"] 到第一个数组。所以我想得到

arr1 = [[["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], ["species", "Alex"], ["female", "yes"], ["group", "B23"]], [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], ["species", "cat"], ["female", "no"], ["group", "A23"]]]

如何比较和组合这些数组?

【问题讨论】:

  • 你真的要使用这个数据结构吗?用散列对象表示会更好。
  • 不幸的是......
  • 你尝试了什么?

标签: arrays ruby compare


【解决方案1】:

你没有提供任何代码,所以我不会写一个完整的解决方案。正如@EddeAlmeida 评论的那样,使用散列数组会容易得多。这是来回转换数据的基本结构:

require 'pp'

arr1 = [[["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], ["species", "Alex"], ["female", "yes"], ["group"]], [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], ["species", "cat"], ["female", "no"], ["group"]]]

arr2 = [["A23", "All", "Katy", "Max"], ["B23", "Sisi", "Alex"]]

data = arr1.map { |a| a.tap { |x| x.last[1] = '' }.to_h }

pp data
# [{"name"=>"Alex",
#   "age"=>"4",
#   "width"=>"55",
#   "weight"=>"30",
#   "species"=>"Alex",
#   "female"=>"yes",
#   "group"=>""},
#  {"name"=>"All",
#   "age"=>"7",
#   "width"=>"26",
#   "weight"=>"3",
#   "species"=>"cat",
#   "female"=>"no",
#   "group"=>""}]

arr2.each do |code, *names|
  # add some logic here
end

# Coming back to (weird) nested arrays :
p data.map{|h| h.to_a}

【讨论】:

    【解决方案2】:

    我是这样做的:

    arr1.each do |data|
        a = data[0][1]
        b = ""
        arr2.each do |x|
            if (x.include?(a)) then
                b << "#{x[0]} "
            end
        end
    data[6].push(b)
    

    结束

    【讨论】:

      【解决方案3】:
      arr1 = [
              [["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"],
               ["species", "Alex"], ["female", "yes"], ["group"]],
              [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"],
               ["species", "cat"], ["female", "no"], ["group"]]
             ]
      
      arr2 = [["A23", "All", "Katy", "Max"], ["B23", "Sisi", "Alex"]]
      

      这里有一种方法可以让arr1的每个元素的元素按任意顺序排列,并在包含"group"的元素被修改后保持该顺序。

      h2 = arr2.each_with_object({}) { |(first,*rest),h| rest.each { |s| h[s] = first } }
        #=> {"All"=>"A23", "Katy"=>"A23", "Max"=>"A23", "Sisi"=>"B23", "Alex"=>"B23"}
      
      arr1.map do |a|
        h = a.each_with_object({}) { |(k,v),h| h[k]=v }
        h["group"] = h2[h["name"]]
        h.to_a
      end
        #=> [[["name", "Alex"], ["age", "4"], ["width", "55"], ["weight", "30"],
        #     ["species", "Alex"], ["female", "yes"], ["group", "B23"]],
        #    [["name", "All"], ["age", "7"], ["width", "26"], ["weight", "3"],
        #     ["species", "cat"], ["female", "no"], ["group", "A23"]]] 
      

      如果arr1 不被突变,则使用Array#map

      arr1的两个元素中的第一个的块计算如下。

      a = arr1.first
        #=> [["name", "Alex"], ["age", "4"], ["width", "55"], ["weight", "30"],
        #    ["species", "Alex"], ["female", "yes"], ["group"]]
      h = a.each_with_object({}) { |(k,v),h| h[k]=v }
        #=> {"name"=>"Alex", "age"=>"4", "width"=>"55", "weight"=>"30",
        #    "species"=>"Alex", "female"=>"yes", "group"=>nil}
      v = h["name"]
        #=> "Alex"
      h["group"] = h2[v]
        #=> h2["Alex"] => "B23" 
      h #=> {"name"=>"Alex", "age"=>"4", "width"=>"55", "weight"=>"30",
        #    "species"=>"Alex", "female"=>"yes", "group"=>"B23"} 
      h.to_a
        #=> [["name", "Alex"], ["age", "4"], ["width", "55"], ["weight", "30"],
        #    ["species", "Alex"], ["female", "yes"], ["group", "B23"]] 
      

      arr1 的第二个元素的计算类似。

      【讨论】:

        猜你喜欢
        • 2020-07-03
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 2020-03-16
        • 2013-11-26
        • 2019-10-20
        • 2020-02-02
        • 2021-05-13
        相关资源
        最近更新 更多