【问题标题】:Getting the common elements between JSON and array in Ruby在 Ruby 中获取 JSON 和数组之间的公共元素
【发布时间】:2014-07-28 22:51:29
【问题描述】:

我现在有一个 JSON 字符串:

[{"id":1,"name":"good","created_at":"2014-07-28T19:45:50.440Z","updated_at":"2014-07-28T19:45:50.440Z"},{"id":2,"name":"better","created_at":"2014-07-28T19:45:50.447Z","updated_at":"2014-07-28T19:45:50.447Z"},{"id":3,"name":"best","created_at":"2014-07-28T19:45:50.449Z","updated_at":"2014-07-28T19:45:50.449Z"}]

我有一个数组:

id = ["1", "3"]

我想检查公共 ID 并打印相关名称。对于上面的例子,我希望我的输出是:

 ["good","best"]

我希望输出最好是一个数组。有没有简单的方法来做到这一点?我一直在编写太多代码来完成这项工作,并且觉得它应该很容易完成。有什么建议吗?

【问题讨论】:

  • 与其要求我们从头开始编写与您的代码完全不同的代码,您应该提供您的代码示例,我们可以对其进行调整。

标签: ruby-on-rails ruby arrays json


【解决方案1】:
# initiate json string
json = %q([{"id":1,"name":"good","created_at":"2014-07-28T19:45:50.440Z","updated_at":"2014-07-28T19:45:50.440Z"},{"id":2,"name":"better","created_at":"2014-07-28T19:45:50.447Z","updated_at":"2014-07-28T19:45:50.447Z"},{"id":3,"name":"best","created_at":"2014-07-28T19:45:50.449Z","updated_at":"2014-07-28T19:45:50.449Z"}])

ids = ["1", "3"]

JSON.parse(json).select{|x| ids.include? x["id"].to_s}.map{|x| x["name"]}
#=> ["good", "best"]  

【讨论】:

    【解决方案2】:

    require 'json'
    
    def pluck(json, ids)
      json_parsed = JSON.parse(json)
    
      json_parsed.select do |obj|
        ids.include?(obj['id'])
      end
      .map do |obj|
        obj['name']
      end
    end
    
    # usage
    json = '[{"id":1,"name":"good","created_at":"2014-07-28T19:45:50.440Z","updated_at":"2014-07-28T19:45:50.440Z"},{"id":2,"name":"better","created_at":"2014-07-28T19:45:50.447Z","updated_at":"2014-07-28T19:45:50.447Z"},{"id":3,"name":"best","created_at":"2014-07-28T19:45:50.449Z","updated_at":"2014-07-28T19:45:50.449Z"}]'
    ids = [1, 3]
    pluck(json, ids)
    

    【讨论】:

    • 在使用select 和map 时使用花括号而不是do/end 是惯用的。
    • 只是试图将其保持在 60 个字符/行以下。我更喜欢垂直传播代码。
    • 哦,我明白你的意思了。我想我也可以垂直使用 {}。
    【解决方案3】:

    在你的控制器中可以这样做:

    def  method_name
    
      render json: Model.pluck(:name).to_json
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-03
      • 2021-03-30
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多