0

私はRubyが初めてで、 stympyの Fakerを使用して匿名化するJSONデータセットを持っています。参照によってハッシュの値を変更したいと思います。

割り当てを変更してみました。key['v] = namea[1]data['cachedBook']['rows'][key][value] = namea[1]しかし、私はno implicit conversion of Array into Stringエラーが発生します。それぞれがそれ自体が配列であるため、これは理にかなっていますが、これをどのように進めるかはわかりません。

たとえば、単一の行data['cachedBook']['rows']は次のようになります。

    [{"v":"Sijpkes_PreviewUser","c":"LN","uid":"9######","iuid":"3####7","avail":true,"sortval":"Sijpkes_PreviewUser"},
{"v":"Paul","c":"FN","sortval":"Paul"},
{"v":"#####_previewuser","c":"UN"},
    {"v":"","c":"SI"},{"v":"30 June 2016","c":"LA","sortval":1467261918000},
    {"v":"Available","c":"AV"},[],[],[],[],[],[],
    {"v":"-","tv":"","numAtt":"0","c":"374595"},[],[],
    {"v":"-","tv":"","numAtt":"0","c":"374596"},[],[],[],
    {"v":0,"tv":"0.0","mp":840,"or":"y","c":"362275"},
    {"v":0,"tv":"0.0","mp":99.99999,"or":"y","c":"389721"}] 

キーと値は、最初の 2 つのエントリとして解釈されます。機密データは s で削除されました####

ルビーコード:

data['cachedBook']['rows'].each do |key, value|
  fullname = Faker::Name.name
  namea = fullname.split(' ')

  str = "OLD: " + String(key['v']) + " " + String(value['v']) +"\n";
  puts str

  if ["Ms.", "Mr.", "Dr.", "Miss", "Mrs."].any? { |needle| fullname.include? needle  }
      key['v'] = namea[2]
      value['v'] = namea[1]
      value['sortval'] = namea[1]
  else
      key['v'] = namea[1]
      value['v'] = namea[0]
      value['sortval'] = namea[1]
  end

  str = "\nNEW: \nFullname: "+String(fullname)+"\nConverted surname: "+ String(key['v']) + "\n\t firstname: " + String(value['v'])
  puts str
end

puts data
4

1 に答える 1

0

OK、これは素晴らしい学習演習でした!

私が抱えていた問題は2つの部分にありました:

  1. からの JSON 出力JSON.parseはハッシュでしたが、ハッシュは配列を格納していたため、コードが壊れていました。上記のサンプル データ行を見ると、いくつかの空の配列が含まれています: ... [],[],[] ....

  2. each がハッシュでどのように機能するかを誤解していましたが、key, value(jquery each に似ている) と思いkey, valueましたが、元の each ステートメントでは、実際には最初の 2 つの配列要素に評価されました。

だからここに私の修正されたコードがあります:

data['cachedBook']['rows'].map! { |row|
  fullname = Faker::Name.name
  namea = fullname.split(' ')

  row.each { |val|

  if val.class == Hash
      newval = val.clone
        if ["Ms.", "Mr.", "Dr.", "Miss", "Mrs."].any? { |needle| fullname.include? needle  }
              if val.key?("c") && val["c"] == "LN"
                newval["v"] = namea[1]
                newval["sortval"] = namea[1]
              end
              if val.key?("c") && val["c"] == "FN"
                newval["v"] = namea[2]
                newval["sortval"] = namea[2]
              end
        else
            if val.key?("c") && val["c"] == "LN"
              newval["v"] = namea[0]
              newval["sortval"] = namea[0]
            end
            if val.key?("c") && val["c"] == "FN"
              newval["v"] = namea[1]
              newval["sortval"] = namea[1]
            end
        end
    val.merge!(newval)
  end
  }
}
于 2016-08-10T23:24:59.960 に答える