【问题标题】:How do I convert an array of strings into a comma-separated string?如何将字符串数组转换为逗号分隔的字符串?
【发布时间】:2012-07-03 14:55:22
【问题描述】:

我有一个数组:

array = ["10", "20", "50", "99"]

我想将它转换成一个简单的逗号分隔的字符串列表,如下所示:

"10", "20", "50", "99"

【问题讨论】:

    标签: ruby-on-rails ruby arrays


    【解决方案1】:

    array.join(',') 几乎可以满足您的需求;它不会保留值周围的引号或后面的空格。

    保留引号和空格:array.map{|item| %Q{"#{item}"}}.join(', ') 这将打印"\"10\", \"20\", \"50\", \"99\""。假设问题确实需要单个字符串,则转义引号是必要的。

    %Q:string literals 上的文档。

    可以inspect 用作suggested in another answer,我会说这是个人喜好。我不会,去看看source code,然后自己选择。

    除了有用:array.to_sentence 会给你一个“1、2、3 和 4”风格的输出,这可能很好!

    【讨论】:

    • 出于好奇,它可以把牛津逗号也放在那里吗?
    • 不,不会。加入不会给他报价。
    • 请注意,to_sentence 仅存在于 ActiveSupport 的 Rails 中。
    • 刚刚在 rails 3.2.5 中测试过。 array.to_sentence 默认包含一个牛津逗号。要排除牛津逗号,您可以使用array.to_sentence(:last_word_connector => " and ")
    • to_sentence 很好用,没想到有!
    【解决方案2】:
    ["10", "20", "50","99"].map(&:inspect).join(', ') # => '"10", "20", "50", "99"'
    

    【讨论】:

    • map{|v| v.to_s.inspect} 将处理整数值和字符串。
    • 当数组元素包含"时会发生什么?
    • ["10", ''].map(&:inspect).join(', ') # => '"10", ""'
    • 我会在代码审查中失败。 inspect 不打算以这种方式使用。
    • @Linuxios 有正确的答案,恕我直言。另一个变体:arr.map {|a| %Q("#{a}")}.join(", ")
    【解决方案3】:

    这里:

    array.map {|str| "\"#{str}\""}.join(',')
    

    【讨论】:

    • 我得到了这个输出 => "\"10\",\"20\",\"50\",\"99\""
    • 那个输出是正确的。反斜杠仅表示它是文字引号,而不是语法引号。
    • @ali:这是正确的输出。 是转义字符,所以\" 代表字符",而开头和结尾的简单" 是字符串分隔符。您可能使用p x 打印结果,这相当于puts x.inspect,请尝试使用puts x 代替
    • 当数组元素包含"时会发生什么?
    • @dbenhur:然后你得到这个字符串:"""
    【解决方案4】:

    一些答案​​提供了使用#map#inspect#join 的解决方案。对于涉及元素中嵌入的逗号和/或字符串分隔符的边缘情况,它们都无法正确获取 CSV 编码的某些细节。

    使用 stdlib 类 CSV 可能是一个更好的主意,然后自行推出。

    irb> require 'csv'
    => true
    irb> a = [10,'1,234','J.R. "Bob" Dobbs',3.14159]
    => [10, "1,234", "J.R. \"Bob\" Dobbs", 3.14159]
    irb> puts a.to_csv
    10,"1,234","J.R. ""Bob"" Dobbs",3.14159
    

    如果此编码不需要关心嵌入的分隔符,或者仅用于某些内部表示,则 map.join 解决方案就足够了,但如果生成数据以与其他需要逗号分隔值的程序交换,则它们将失败 ( CSV)作为一种普遍理解的表示形式。

    【讨论】:

    • 我认为他只是想要那个字符串表示,而不是完整的 CSV。
    • 生成一个数组字符串非常好,然后可以再次导出为 CSV 字段以及其他值
    【解决方案5】:

    最简单的解决方案是使用内置的“.to_sentence”方法。

    所以

    ["fred", "john", "amy"].to_sentence 输出 "fred, john, and amy"

    【讨论】:

    • .to_sentence 很好,但它不提供请求的输出。
    【解决方案6】:

    这是一个稍微替代的解决方案,如果您需要将带有双引号字符串的数组转换为单引号列表(例如 SQL 查询),则特别方便:

    "'#{["John Oliver", "Sam Tom"].join("','")}'"
    

    'John Oliver', 'Sam Tom'
    

    署名:https://alok-anand-ror.blogspot.com/2014/04/ruby-join-array-elements-with-single.html

    【讨论】:

      【解决方案7】:

      这是您可以使用 FCM for Android 设备发送推送通知的方式。 假设您想在用户在其状态上发布某些内容时通知关注者,这就是您的操作方式。这是在 Rails 5.2.6 for Rest APIs 中完成的——但您仍然可以将其用于 Web 推送通知。这是为了向许多带有registration_ids的设备发送通知以定位关注者。 宝石:fcm 在您的控制器中:

      require "fcm"
      
      def create_vibe(user)
        @vibe = user.vibes.new(content: @content, picture: @picture, video: @video, isvideofile: @isvideofile, video_thumbnail: @video_thumbnail, source: @source, background_color: @background_color)
        @followed = user.followers
        if @followed.present?
          @registration = @followed.map { |s| s.registration_id }
        end
        if @vibe.save
          fcm = FCM.new("") # set your FCM_SERVER_KEY
      
          options = {
            data: {
              notification_type: 1,
              title: "#{@vibe.user.username} " "has posted a new Vibe",
              body: "#{@vibe.content}",
              user_data: {
                vibe_id: @vibe.id,
                user_id: @vibe.user.id,
                background_color: @background_color,
      
              },
            },
          }
          response = fcm.send(@registration, options)
          puts response
          render :status => 200,
            :json => { :success => true,
                      :info => "Vibe posted successfully",
                      :vibe_info => {
              :content => @content,
              :picture => @picture,
              :video => @video,
              :video_thumbnail => @video_thumbnail,
              :isvideofile => @isvideofile,
              :source => @source,
              :fcm => options,
            } }
        else
          render :status => 200, :json => { :success => false, :result => "Vibe can't be blank" }
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-18
        • 2020-05-21
        • 2011-06-18
        • 2019-05-19
        • 2019-11-18
        相关资源
        最近更新 更多