রুবিতে কীভাবে একটি অ্যারে হ্যাশ সাজানো যায়


147

আমার একটি অ্যারে রয়েছে, যার প্রতিটি উপাদানের তিনটি কী / মান জোড়া সহ একটি হ্যাশ রয়েছে:

:phone => "2130001111", :zip => "12345", :city => "sometown"

আমি ডেটা বাছাই করতে চাই zipতাই phoneএকই অঞ্চলে সমস্ত গুলি এক সাথে থাকে। রুবির কি তা করার কোনও সহজ উপায় আছে? will_paginateএকটি অ্যারের মধ্যে ডেটা পৃষ্ঠাতে পারেন ?


যদি আপনি অ্যারে তৈরি করে থাকেন তবে এটি প্রদত্ত হওয়ার পরিবর্তে উপাদানগুলি (উদাহরণস্বরূপ) [city,zip]=>phoneবা এর পরিবর্তে এটিকে হ্যাশ হিসাবে বিবেচনা করুন city=>{zip1=>[<phones>], zip2=>...}
কেরি সোভোল্যান্ড

উত্তর:


364

Simples:

array_of_hashes.sort_by { |hsh| hsh[:zip] }

বিঃদ্রঃ:

ব্যবহার করার সময় sort_byআপনাকে ফলাফলটি একটি নতুন ভেরিয়েবলের কাছে বরাদ্দ করতে হবে: array_of_hashes = array_of_hashes.sort_by{}অন্যথায় আপনি জায়গায় পরিবর্তন করতে "ব্যাং" পদ্ধতিটি ব্যবহার করতে পারেন:array_of_hashes.sort_by!{}


8
ব্যবহার করার সময় sort_byআপনাকে ফলাফলটি একটি নতুন ভেরিয়েবলের কাছে বরাদ্দ করতে হবে: array_of_hashes = array_of_hashes.sort_by{}অন্যথায় আপনি জায়গায় পরিবর্তন করতে "ঠুং শব্দ" পদ্ধতিটি ব্যবহার করতে পারেন:array_of_hashes.sort_by!{}
অ্যান্ড্রু

11
এমনকি আরও ছোট:array_of_hashes.sort_by(&:zip)
এটিয়েন

24
@ এটেন: এটির জন্য একটি শর্টকাট .sort_by { |hsh| hsh.zip }এবং সুতরাং .zipপ্রতিটি হ্যাশের একটি পদ্ধতি হিসাবে সংজ্ঞায়িত হলেই এটি কাজ করবে । ডিফল্টরূপে হ্যাশগুলি পদ্ধতিগুলি হিসাবে তাদের কীগুলি প্রকাশ করে না, সুতরাং আমি অনুমান করি যে সম্ভবত আপনি সেখানে কিছু অন্যরকম পেয়েছেন।
গ্যারেথ

array_of_hashes.sort_by!(&:zip)
দিয়েগো ডি

@ গ্যারেথ: অ্যাক্টিভেকর্ডগুলির ক্ষেত্রে .zipএবং [:zip]উভয়ই কাজ করবে। অ্যাক্টিভেকর্ডস উভয় স্টাইল সংজ্ঞায়িত করা আছে।
অতুল বৈভব


10

অ্যারে জায়গায় পরিবর্তন করতে ঠুং ঠুং শব্দ ব্যবহার করুন:

array_of_hashes.sort_by!(&:zip)

অথবা এটি পুনরায় বরাদ্দ করুন:

array_of_hashes = array_of_hashes.sort_by(&:zip)

নোট করুন যে সাজানো_বাই পদ্ধতিটি আরোহী ক্রম অনুসারে বাছাই করবে।

যদি আপনাকে অবতরণ ক্রম অনুসারে বাছাই করা দরকার তবে আপনি এর মতো কিছু করতে পারেন:

array_of_hashes.sort_by!(&:zip).reverse!

অথবা

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse

6
স্বরলিপি &:একটি শর্টকাট method, না attribute! আপনি অনুমান করছেন যে হ্যাশের বৈশিষ্ট্যগুলি প্রতিবিম্বিত করার পদ্ধতি রয়েছে ..
আন্দ্রে ফিগুয়েরেদো

1
reverseপদ্ধতির জন্য ধন্যবাদ : পি
আলেন অ্যান্ড্রে

4

আপনি উচিত অ্যারের মধ্যে ডেটার জন্য পৃষ্ঠা নম্বর দেওয়া করতে চান, 'will_paginate / অ্যারে' প্রয়োজন, আপনার নিয়ামক মধ্যে


2

যদি আপনার নেস্টেড হ্যাশ (হ্যাশ ফর্ম্যাটের অভ্যন্তরে হ্যাশ) অ্যারে উপাদান হিসাবে রয়েছে (নীচের মতো একটি কাঠামো) এবং কী দ্বারা এটি বাছাই করতে চান (এখানে তারিখ)

data =  [
    {
        "2018-11-13": {
            "avg_score": 4,
            "avg_duration": 29.24
        }
    },
    {
         "2017-03-13": {
            "avg_score": 4,
            "avg_duration": 40.24
        }
    },
    {
         "2018-03-13": {
            "avg_score": 4,
            "avg_duration": 39.24
        }
    }
]

হিসাবে অ্যারে 'সাজ্ট_বাই' পদ্ধতিটি ব্যবহার করুন

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