অন্য কী দিয়ে হ্যাশ কী কীভাবে প্রতিস্থাপন করা যায়


191

আমার একটি শর্ত আছে যেখানে আমি একটি হ্যাশ পাই

  hash = {"_id"=>"4de7140772f8be03da000018", .....}

এবং আমি এই হ্যাশ হিসাবে চাই

  hash = {"id"=>"4de7140772f8be03da000018", ......}

PS : আমি জানি না হ্যাশগুলির কীগুলি কী, সেগুলি এলোমেলো যা প্রতিটি কী জন্য "_" উপসর্গ সহ আসে এবং আমি কোনও আন্ডারস্কোর চাই না


এই আপনাকে সাহায্য করতে পারেন: stackoverflow.com/questions/4044451/...
জারিত

দরকারী প্রশ্নের জন্য +1
আশিসরাই_

@ এ 5 এই: এটি সাহায্য পেয়ে আমি আনন্দিত :)
মণীশ দাস

সম্পর্কিত: _idid
মংগোডিবি

উত্তর:


710
hash[:new_key] = hash.delete :old_key

8
আমাকে একটি দম্পতি এলওসি বাঁচিয়েছে, ভালবেসে!
নিকোহভি

10
আমি প্রায়শই "স্মার্ট" রুবি কোড পছন্দ করি না কারণ এটি আসলে কী করছে তা বলতে কিছুটা সময় লাগে। আপনার সমাধান অন্যদিকে সহজ এবং বর্ণনামূলক।
লুকাস

3
এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত! সহজ, পরিষ্কার এবং সরাসরি বিন্দু!
গিগাবাস

1
এই উত্তরটি মার্জিত তবে এটি আসলে প্রশ্নের উত্তর দেয় না। পোস্টটিতে বলা হয়েছে যে কীগুলি প্রতিস্থাপনের দরকার তা অজানা ... আমরা কেবল জানি যে সেগুলি একটি আন্ডারস্কোর দিয়ে শুরু করা হয়, কীগুলি আসলে কী তা আমরা জানি না।
ডিসেল

2
সুতরাং এটি একটি নতুন কী / মান জুটি তৈরি করে যেখানে আপনি নতুন কী নির্দিষ্ট করে এবং কীটি hash.delete :old_keyফিরে আসে এবং মুছুন তা পুরানো কীটি ব্যবহার করে তার থেকে মূল্য পান । বাহ, আমি এটি কোথাও উলকি আঁকা চাই :-D ধন্যবাদ
বার্ট সি

136

রেল হ্যাশ এর মানক পদ্ধতি রয়েছে:

hash.transform_keys{ |key| key.to_s.upcase }

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys

ইউপিডি: রুবি 2.5 পদ্ধতি


4
এটি রেলস পদ্ধতি, মানক নয়। ভাল উত্তর যদিও।
ব্যবহারকারী 2422869

1
এছাড়াও, এই পদ্ধতিটি হ্যাশ কীগুলি পুনরাবৃত্তভাবে পরিচালনা করতে পারে না।
সার্জিও বেলভস্কিজ

5
ডিপ_টান্সফর্ম_কিজ এটির জন্য ব্যবহার করা যেতে পারে :) apidock.com/rails/v4.2.1/Hash/DP_transfor_keys
gayavat

1
শেষ পর্যন্ত! ঠিক এইটাই আমি অনুসন্ধান করেছি!
টিআইসার

4
এটি রুবি 2.5 এর মতো ভাষার একটি স্ট্যান্ডার্ড অংশ: ডকস.রবি -আলংআর.ইন
ডেভিড গ্রেসন

39

যদি সমস্ত কীগুলি স্ট্রিং হয় এবং সেগুলির সকলের আন্ডারস্কোর উপসর্গ থাকে তবে আপনি এটির সাহায্যে হ্যাশটি প্যাচ করতে পারেন:

h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }

দ্য k[1, k.length - 1]বিট সব grabs kপ্রথম অক্ষর ছাড়া। আপনি যদি একটি অনুলিপি চান, তবে:

new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]

অথবা

new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }

আপনি ব্যবহার করতে পারে sub যদি k[]স্ট্রস্ট্রিং উত্তোলনের জন্য স্বরলিপিটি পছন্দ না করেন তবে আপনি পারেন :

h.keys.each { |k| h[k.sub(/\A_/, '')] = h[k]; h.delete(k) }
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }

এবং, যদি কেবল কয়েকটি কীতে আন্ডারস্কোর উপসর্গ থাকে:

h.keys.each do |k|
  if(k[0,1] == '_')
    h[k[1, k.length - 1]] = h[k]
    h.delete(k)
  end
end

উপরের অন্যান্য সমস্ত রূপগুলিতে অনুরূপ পরিবর্তনগুলি করা যেতে পারে তবে এই দুটি:

Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }

অতিরিক্ত পরিবর্তন ছাড়াই আন্ডারস্কোর উপসর্গ নেই এমন কীগুলির সাথে ঠিক থাকা উচিত।


আপনার উত্তরটি কাজ করেছে তবে ওয়ার্ডের পরে আমি এর মতো কয়েকটি হ্যাশ পেয়েছি
মণীশ দাস

3
_ "_আইডি" => "4de7140772f8be03da000018", "_type" => "ওয়ার্কস্টেশন", "তৈরি_আট" => "2011-06-02T10: 24: 35 + 05: 45", "ইনপুট_হেডার_আইডস" => [], "লাইন_আইডি "=>" 4de7140472f8be03da000017 "," আপডেট_এট "=>" 2011-06-02T10: 24: 35 + 05: 45 "}
মনীষ দাস

2
id "id" => "4de7140772f8be03da000018", "টাইপ" => "ওয়ার্কস্টেশন", "রিটেড_এট" => "2011-06-02T10: 24: 35 + 05: 45", "এনপুট_হেডার_আইডিস" => [], "ইন_আইডি "=>" 4de7140472f8be03da000017 "," pdated_at "=>" 2011-06-02T10: 24: 35 + 05: 45 "}
মনীষ দাস

@ মনিশ: আমি বলেছিলাম "যদি সমস্ত কীগুলি স্ট্রিং হয় এবং তাদের সকলের আন্ডারস্কোর উপসর্গ থাকে"। আমি একটি আপডেটে আপনার "আন্ডারস্কোর উপসর্গবিহীন কীগুলির" জন্য একটি উদাহরণ পদ্ধতির অন্তর্ভুক্ত করেছি।
মিউ খুব ছোট

2
@ মনিশ: "কে" "কী" এর জন্য, "ভি" "মান" এর জন্য, "এক্স" এর জন্য "আমি কী বলতে পারি তা জানি না তবে আমি গণিতবিদ হিসাবে প্রশিক্ষণ পেয়েছি তাই আমি এটিকে এক্স বলি"।
মিউ খুব ছোট

14

আপনি করতে পারেন

hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option}

এটি আপনার ক্ষেত্রে কাজ করা উচিত!


11

যদি আমরা হ্যাশের একটি নির্দিষ্ট কীটির নাম পরিবর্তন করতে চাই তবে আমরা এটি নিম্নলিখিত হিসাবে এটি করতে পারি: মনে
করুন যে আমার হ্যাশ my_hash = {'test' => 'ruby hash demo'}
এখন আমি 'বার্তা' দ্বারা 'পরীক্ষা' প্রতিস্থাপন করতে চাই, তাহলে:
my_hash['message'] = my_hash.delete('test')


আপনার উত্তরটি কীভাবে আমার সমস্যার সমাধান? আপনি যদি এটি সহায়ক বলে মনে করেন, তবে আপনি প্রশ্নের অধীনে মন্তব্যটিতে যোগ করতে পারতেন। আমার প্রশ্নটি একটি কীটি অন্য কী দিয়ে প্রতিস্থাপন করা নয়, আপনি যে সমাধানটি দিয়েছেন তা খুব বেসিক হ্যাশ সম্পত্তি। আমার ক্ষেত্রে এটি নয়: hash[:new_key] = has[:old_key]পরিবর্তে এটি hash[:dynamic_key] = hash[:_dynamic_key]:, এটি রেইগেক্স সম্পর্কিত পরিষ্কার প্রশ্ন ছিল এবং সহজ হ্যাশ প্রতিস্থাপন নয়।
মণীশ দাস

2
আমি একটি গুগল অনুসন্ধানের মাধ্যমে এটিতে এসেছি এবং @ স্বপ্নিলের উত্তর চেয়েছিলাম। ধন্যবাদ
Toobulkeh

10
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }

4
আমি পছন্দ করি যে আপনি আন্ডারস্কোরগুলি সঠিকভাবে ফিল্টার করার জন্য একটি রেজেক্স ব্যবহার করার চেষ্টা করেছিলেন, তবে আপনাকে সচেতন হওয়া উচিত যে রুবিতে জাভাস্ক্রিপ্ট এবং অন্যদের থেকে আলাদা, / ^ / এর অর্থ 'স্ট্রিং বা লাইনের শুরু' এবং / $ / এর অর্থ 'শেষ' স্ট্রিং বা লাইন '। এই ক্ষেত্রে কীগুলির মধ্যে নতুন লাইন রয়েছে এটি অসম্ভাব্য, তবে আপনার সচেতন হওয়া উচিত যে রুবীতে এই দুটি অপারেটর ব্যবহার করা কেবল ত্রুটি প্রবণ নয়, তবে ইঞ্জেকশনের বিরুদ্ধে বৈধতা প্রয়োগ করার ক্ষেত্রেও বিপজ্জনক। ব্যাখ্যা জন্য এখানে দেখুন । আশা করি আপনি সচেতনতা ছড়িয়ে দিতে কিছু মনে করবেন না।
জর্ন ভ্যান ডি বেক


1

আমি overkill গিয়েছিলাম এবং নিম্নলিখিত সঙ্গে এসেছিলেন। এর পিছনে আমার অনুপ্রেরণা হ্যাশ কীগুলিতে সংযুক্তি ছিল যখন একত্রে মার্জ করার সময় / ফ্ল্যাশিং হ্যাশগুলি সুযোগের দ্বন্দ্ব এড়ায়।

উদাহরণ

হ্যাশ ক্লাস প্রসারিত করুন

হ্যাশ দৃষ্টান্তগুলিতে রিকি পদ্ধতি যুক্ত করে।

# Adds additional methods to Hash
class ::Hash
  # Changes the keys on a hash
  # Takes a block that passes the current key
  # Whatever the block returns becomes the new key
  # If a hash is returned for the key it will merge the current hash 
  # with the returned hash from the block. This allows for nested rekeying.
  def rekey
    self.each_with_object({}) do |(key, value), previous|
      new_key = yield(key, value)
      if new_key.is_a?(Hash)
        previous.merge!(new_key)
      else
        previous[new_key] = value
      end
    end
  end
end

উদাহরণ প্রস্তুত করুন

my_feelings_about_icecreams = {
  vanilla: 'Delicious',
  chocolate: 'Too Chocolatey',
  strawberry: 'It Is Alright...'
}

my_feelings_about_icecreams.rekey { |key| "#{key}_icecream".to_sym }
# => {:vanilla_icecream=>"Delicious", :chocolate_icecream=>"Too Chocolatey", :strawberry_icecream=>"It Is Alright..."}

ছাঁটাই উদাহরণ

{ _id: 1, ___something_: 'what?!' }.rekey do |key|
  trimmed = key.to_s.tr('_', '')
  trimmed.to_sym
end
# => {:id=>1, :something=>"what?!"}

একটি "সুযোগ" সমতল এবং সংযোজন

আপনি যদি কোনও হ্যাশকে পুনরায় রেখে যান তবে এটি হ্যাশটিকে মার্জ করবে যা আপনাকে সংগ্রহগুলি সমতল করতে দেয়। মার্জ করার পরে কী ওভাররাইটিং এড়াতে একটি হ্যাশ সমতল করার সময় এটি আমাদের কীগুলিতে সুযোগ যোগ করতে দেয়।

people = {
  bob: {
    name: 'Bob',
    toys: [
      { what: 'car', color: 'red' },
      { what: 'ball', color: 'blue' }
    ]
  },
  tom: {
    name: 'Tom',
    toys: [
      { what: 'house', color: 'blue; da ba dee da ba die' },
      { what: 'nerf gun', color: 'metallic' }
    ]
  }
}

people.rekey do |person, person_info|
  person_info.rekey do |key|
    "#{person}_#{key}".to_sym
  end
end

# =>
# {
#   :bob_name=>"Bob",
#   :bob_toys=>[
#     {:what=>"car", :color=>"red"},
#     {:what=>"ball", :color=>"blue"}
#   ],
#   :tom_name=>"Tom",
#   :tom_toys=>[
#     {:what=>"house", :color=>"blue; da ba dee da ba die"},
#     {:what=>"nerf gun", :color=>"metallic"}
#   ]
# }

0

পূর্ববর্তী উত্তরগুলি যথেষ্ট ভাল তবে তারা আসল ডেটা আপডেট করতে পারে। যদি আপনি না চান তবে মূল ডেটাটি প্রভাবিত হোক, আপনি আমার কোডটি চেষ্টা করতে পারেন।

 newhash=hash.reject{|k| k=='_id'}.merge({id:hash['_id']})

প্রথমে এটি '_id' কীটিকে অগ্রাহ্য করবে তারপরে আপডেট হওয়াটির সাথে মিশে যাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.