মান অনুসারে বস্তুর সম্পত্তি বাছাই করা হচ্ছে


694

আমার যদি জাভাস্ক্রিপ্ট অবজেক্ট থাকে যেমন:

var list = {
  "you": 100, 
  "me": 75, 
  "foo": 116, 
  "bar": 15
};

মানের উপর ভিত্তি করে সম্পত্তিগুলি বাছাই করার কোনও উপায় আছে? যাতে আমি শেষ পর্যন্ত

list = {
  "bar": 15, 
  "me": 75, 
  "you": 100, 
  "foo": 116
};

4
কেবল "বাছাই" নয়, আরও গুরুত্বপূর্ণভাবে সংখ্যা বাছাই করা। নম্বরগুলি জাভাস্ক্রিপ্টস অ্যারে.সর্ট () পদ্ধতির সাথে প্রতিরোধক, যার অর্থ আপনাকে কেবল বৈশিষ্ট্য বাছাই করার জন্য কোনও পদ্ধতি আবিষ্কার করতে হবে না, তবে সংখ্যার মানগুলির তুলনা করতে আপনাকে নিজের ফাংশনটি লিখতে হবে।
সাম্পসন

104
উত্তরগুলি পড়ার আগে: উত্তরটি হ'ল না । বস্তুর বৈশিষ্ট্যগুলির ক্রম ECMAScript এ মানক নয়। জাভাস্ক্রিপ্ট অবজেক্টের উপাদানগুলির ক্রম সম্পর্কে আপনার কখনই অনুমান করা উচিত নয়। একটি অবজেক্ট হ'ল সম্পত্তিগুলির একটি নিরক্ষিত সংগ্রহ। নীচের উত্তরগুলি আপনাকে অ্যারেগুলির সহায়তা ব্যবহার করে বাছাই করা বৈশিষ্ট্যগুলি কীভাবে "ব্যবহার" করতে পারে তা দেখায়, কিন্তু বাস্তবে তাদের নিজের সামগ্রীর বৈশিষ্ট্যের ক্রমটি কখনই পরিবর্তন করে না। সুতরাং, না, এটি সম্ভব নয়। এমনকি আপনি পূর্বনির্ধারিত বৈশিষ্ট্য সহ কোনও অবজেক্ট তৈরি করলেও, গ্যারান্টিযুক্ত নয় যে তারা ভবিষ্যতে একই ক্রমে প্রদর্শিত হবে। পড়তে :).
গোবিন্দ রায়

3
@ গোবিন্দরাই এখনও, বাস্তব বিশ্বের সম্মুখভাগের অ্যাপ্লিকেশনগুলিতে আমরা আইডি সহ অবজেক্ট কালেকশনকে কী হিসাবে লুপ করি এবং এইচটিএমএল টেম্পলেটগুলিতে অনুবাদ করা থাকলে ক্রমটি গুরুত্বপূর্ণ। আপনি বলছেন যে তাদের কোনও অর্ডার নেই, আমি বলি বর্তমান ব্রাউজারে তাদের কনসোল.লগ করার সময় আমি দেখতে পাই ঠিক ঠিক সেভাবেই। এবং এই অর্ডার পুনরায় সাজানো যেতে পারে। আপনি এগুলি লুপ করার সাথে সাথে তাদের একটি আদেশ রয়েছে।
সমস্যাগুলি

7
@ গোবিন্দরাই: এখন অনুমানের একটি নির্দিষ্ট ক্রমে বৈশিষ্ট্য অ্যাক্সেস করার উপায় রয়েছে। এটা কি ভাল ধারণা? প্রায় অবশ্যই না। :-) তবে এটি ES2015 হিসাবে আছে।
টিজে ক্রাউডার

7
2019 দর্শক: এই সবে upvoted পরীক্ষা Object.entries: ভিত্তিক উত্তর যা ES2017 যেহেতু শিল্পের cleanest এবং সবচেয়ে পাঠযোগ্য রাষ্ট্র stackoverflow.com/a/37607084/245966
jakub.g

উত্তর:


704

এগুলিকে একটি অ্যারেতে সরান, সেই অ্যারেটিকে বাছাই করুন এবং তারপরে আপনার উদ্দেশ্যগুলির জন্য সেই অ্যারেটি ব্যবহার করুন। এখানে একটি সমাধান:

var maxSpeed = {
    car: 300, 
    bike: 60, 
    motorbike: 200, 
    airplane: 1000,
    helicopter: 400, 
    rocket: 8 * 60 * 60
};
var sortable = [];
for (var vehicle in maxSpeed) {
    sortable.push([vehicle, maxSpeed[vehicle]]);
}

sortable.sort(function(a, b) {
    return a[1] - b[1];
});

//[["bike", 60], ["motorbike", 200], ["car", 300],
//["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]

আপনার অ্যারেটি একবার হয়ে গেলে আপনি অ্যারে থেকে আপনার পছন্দ মতো ক্রমটি পুনর্নির্মাণ করতে পারেন, তাই আপনি যা করতে ঠিক করেছিলেন তা অর্জন করতে পারেন। এটি আমার জানা সমস্ত ব্রাউজারগুলিতে কাজ করবে তবে এটি বাস্তবায়নের তাত্পর্যের উপর নির্ভর করবে এবং যে কোনও সময় ভেঙে যেতে পারে। জাভাস্ক্রিপ্ট অবজেক্টের উপাদানগুলির ক্রম সম্পর্কে আপনার কখনই অনুমান করা উচিত নয়।

var objSorted = {}
sortable.forEach(function(item){
    objSorted[item[0]]=item[1]
})

24
আপনি কীগুলির ক্রম বজায় রাখতে এবং বস্তু থেকে মানগুলি টানতে অ্যারে ব্যবহার করতে পারেন "আপনি পুনর্নির্মাণ করতে পারেন" এটিকে সংশোধন করতে পারেন? আপনি কেবল উল্লেখ করেছেন যে এটি কেবল অ-মানকই নয়, এই ভ্রান্ত ধারণাটি আজ কেবল ক্রোমের চেয়েও বেশি ব্রাউজার দ্বারা ভেঙে গেছে, তাই ব্যবহারকারীদের এটি চেষ্টা করতে উত্সাহিত না করা ভাল।
ওলেগ ভি। ভলকভ

32
আপনার কোডটির আরও কমপ্যাক্ট সংস্করণ এখানে। অবজেক্ট.কিজ (ম্যাক্সস্পিড) .সোর্ট (ফাংশন (ক, খ) {রিটার্ন - (ম্যাক্সস্পিড [এ] - ম্যাক্সস্পিড [বি])});
দ্য ব্রেন

6
@ দ্য ব্রেন: এটি যুক্ত করার জন্য, কেবল আইই 9 keys()+ (এবং অন্যান্য আধুনিক ব্রাউজারগুলি) সমর্থন করে যদি এটি উদ্বেগের হয়। এছাড়াও keys()উপাদানগুলির প্রোটোটাইপ চেইন (এর..ইন) থেকে অগণিত বৈশিষ্ট্যগুলি বাদ দেয় - তবে এটি সাধারণত আরও আকাঙ্ক্ষিত।
মিঃ হোয়েট

31
_.pairsকোনও বস্তুকে [[কী 1, মান 1], [কী 2, মান 2]] তে পরিণত করে। তারপরে কল সাজান। তারপরে _.objectএটি ফিরিয়ে আনার জন্য কল করুন।
ফানকোডাব্যাট

2
আমার প্রকল্পটি পরিষ্কারভাবে মার্জ করার জন্য অবজেক্ট কীগুলির প্রয়োজন, তবে মেটাডেটা ইউআই ড্রাইভ করার সাথে সাথে স্পষ্টভাবে বাছাই করাও দরকার। প্রোটোটাইপ চেইন ক্রলিং এড়ানোর জন্য আমি কেবল একই রকম পদ্ধতির অনুসরণ করেছি rop জেএস হ্যাকারুনুন.com
নাথান অ্যাগারিয়া

416

আমরা পুরো ডেটা স্ট্রাকচারটি নকল করতে চাই না বা এমন একটি অ্যারে ব্যবহার করতে চাই না যেখানে আমাদের একটি সহযোগী অ্যারে দরকার।

বোনা হিসাবে একই জিনিসটি করার আরও একটি উপায় এখানে:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})
console.log(keysSorted);     // bar,me,you,foo


22
এটি কী দ্বারা বাছাই করা হচ্ছে বলে মনে হচ্ছে, মান নয়, যা প্রশ্নটি নয়?
মাইকেল

27
এটি মান অনুসারে বাছাই করা হয় এবং কীগুলি প্রদর্শন করে - তবে এটি কেবল কীগুলি প্রিন্ট করে তাই আমরা মান গণনাটি হারাব।
হান্না

6
জাভাস্ক্রিপ্টে অবজেক্ট প্রোপার্টি অর্ডারটির গ্যারান্টি নেই, সুতরাং বাছাই একটি অ্যারেতে করা উচিত, কোনও বস্তু নয় (যা আপনি 'এসোসিয়েটিভ অ্যারে' হিসাবে উল্লেখ করছেন)।
ক্রিস্টোফার মায়ার্স

6
ভুলে যাবেন না keysSortedএকটি অ্যারে! বস্তু নয়!
সবুজ

17
আপনি যদি .map(key => list[key]);বাছাইয়ের শেষে যুক্ত করেন তবে এটি কেবল কীটির পরিবর্তে পুরো বস্তুটি ফিরিয়ে দেবে
জেমস মুরান

182

আপনার অবজেক্টে যেকোন পরিমাণের বৈশিষ্ট্য থাকতে পারে এবং আপনি যদি বস্তুগুলিকে অ্যারেতে রাখেন তবে আপনি যে কোনও বস্তুর সম্পত্তি, নম্বর বা স্ট্রিং চান তা অনুসারে বাছাই করতে পারেন। এই অ্যারে বিবেচনা করুন:

var arrayOfObjects = [   
    {
        name: 'Diana',
        born: 1373925600000, // Mon, Jul 15 2013
        num: 4,
        sex: 'female'
    },
    {

        name: 'Beyonce',
        born: 1366832953000, // Wed, Apr 24 2013
        num: 2,
        sex: 'female'
    },
    {            
        name: 'Albert',
        born: 1370288700000, // Mon, Jun 3 2013
        num: 3,
        sex: 'male'
    },    
    {
        name: 'Doris',
        born: 1354412087000, // Sat, Dec 1 2012
        num: 1,
        sex: 'female'
    }
];

জন্মের তারিখ অনুসারে বাছাই করুন, প্রাচীনতম

// use slice() to copy the array and not just make a reference
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a,b) {
    return a.born - b.born;
});
console.log('by date:');
console.log(byDate);

নাম অনুযায়ী সাজাও

var byName = arrayOfObjects.slice(0);
byName.sort(function(a,b) {
    var x = a.name.toLowerCase();
    var y = b.name.toLowerCase();
    return x < y ? -1 : x > y ? 1 : 0;
});

console.log('by name:');
console.log(byName);

http://jsfiddle.net/xsM5s/16/


1
নাম অনুসারে বাছাই করা উচিত substrপ্রথম অক্ষরটি নয়; অন্যথায় Dianaএবং Debraএকটি অপরিবর্তিত অর্ডার আছে। এছাড়াও, আপনার byDateসাজানোর আসলে ব্যবহার করে num, না born
লরেন্স ডল

এটি দেখতে দুর্দান্ত দেখাচ্ছে, তবে মনে রাখবেন যে স্ট্রিংগুলি তুলনা করতে আপনি স্রেফ ব্যবহার করতে পারেনx.localeCompare(y)
জেমার জোন্স

2
@ জেমার জোনসকে localCompareএকটি খুব কার্যকর ফাংশন বলে মনে হচ্ছে! কেবল লক্ষ্য করুন যে এটি প্রতিটি ব্রাউজারে সমর্থন করা হবে না - আইই 10 এবং তার চেয়ে কম, সাফারি মোবাইল 9 এবং তার চেয়ে কম।
অজৈব

@ ইনরগানিক হ্যাঁ যারা এই ব্রাউজারগুলিকে সমর্থন করতে হবে তাদের জন্য হ্যাঁ খুব ভাল নোট
জেমার জোন্স

1
এটি অবজেক্টগুলির একটি অ্যারে, যা ওপি জিজ্ঞাসা করে না (বেশ কয়েকটি বৈশিষ্ট্যযুক্ত একটি বস্তু)
জোও পিমেন্টেল ফেরারিরা

62

সম্পূর্ণতার জন্য, এই ফাংশনটি অবজেক্ট বৈশিষ্ট্যের সাজানো অ্যারে প্রদান করে:

function sortObject(obj) {
    var arr = [];
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            arr.push({
                'key': prop,
                'value': obj[prop]
            });
        }
    }
    arr.sort(function(a, b) { return a.value - b.value; });
    //arr.sort(function(a, b) { a.value.toLowerCase().localeCompare(b.value.toLowerCase()); }); //use this to sort as strings
    return arr; // returns array
}

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var arr = sortObject(list);
console.log(arr); // [{key:"bar", value:15}, {key:"me", value:75}, {key:"you", value:100}, {key:"foo", value:116}]

উপরের কোড সহ জেএসফিডাল এখানে । এই সমাধানটি এই নিবন্ধের ভিত্তিতে তৈরি ।

স্ট্রিং বাছাইয়ের জন্য আপডেট করা ফিডল এখানে। সংবেদনশীল স্ট্রিং তুলনার জন্য আপনি এ থেকে অতিরিক্ত .toLowerCase () রূপান্তর দুটিই সরাতে পারেন।


1
অবজেক্টের অ্যারে সম্পর্কে কী? [{নাম: উইল}, {নাম: বিল}, {নাম: বেন}]
হ্যানকক

1
হাই উইল, আপনি এই তুলনার জন্য লোকালকম্পিয়ার ফাংশনটি ব্যবহার করতে পারেন । এটি উপরের উত্তরে যুক্ত হয়েছে।
স্টানো

দুর্দান্ত সমাধান। স্ট্রিং সাজানোর জন্য একটি রিটার্ন দরকার
পিএফডব্লু

@ স্টানো সঠিক এবং সহজ সমাধান। অনেক ধন্যবাদ.
আবরার হোসেন

48

ECMAScript 2017 উপস্থাপন করেছে Object.values / Object.entries। নাম অনুসারে, প্রাক্তন কোনও বস্তুর সমস্ত মানকে একটি অ্যারেতে একত্রিত করে এবং পরবর্তীকটি পুরো বস্তুকে অ্যারেতে [key, value]অ্যারে করে তোলে ; পাইথনের সমতুল্য dict.values()এবং dict.items()

বৈশিষ্ট্যগুলি কোনও হ্যাশকে একটি আদেশযুক্ত বস্তুর মধ্যে বাছাই করা বেশ সহজ করে তোলে। এখন পর্যন্ত, জাভাস্ক্রিপ্ট প্ল্যাটফর্মগুলির একটি ছোট অংশই তাদের সমর্থন করে অবধি, তবে আপনি এটি ফায়ারফক্স 47+ এ চেষ্টা করতে পারেন।

let obj = {"you": 100, "me": 75, "foo": 116, "bar": 15};

let entries = Object.entries(obj);
// [["you",100],["me",75],["foo",116],["bar",15]]

let sorted = entries.sort((a, b) => a[1] - b[1]);
// [["bar",15],["me",75],["you",100],["foo",116]]

এটি কীভাবে প্রশ্নের শিরোনামের উত্তর দেয় Sorting JavaScript Object by property value? আপনি যে প্রশ্নটি আমার মনে করেন সেটিকে আপনি ভুল বুঝেছিলেন, যেহেতু আপনি আসল অবজেক্টটি পরিবর্তন করবেন এবং এটি থেকে কোনও নতুন অ্যারে তৈরি করবেন না।
vsync

2
@vsync এই উত্তরটি স্বীকৃত উত্তরের মতো একই ফলাফল দেয় তবে কম কোড এবং অস্থায়ী পরিবর্তনশীল সহ।
ড্যারেন কুক

3
এফডাব্লুআইডাব্লু, এই উত্তরটি পরিষ্কার and
নেটওপ্রেটর উইব্বি

কেবলমাত্র এফএফ-তে, অর্থাত্‍ ক্রোম বা ক্রোম হয় না they wtf
fb

কেবল লক্ষ্য করুন যে এটি কীগুলি সংরক্ষণ করবে না।
ভেল ভিক্টাস

40

একটি "arrowed" @marcusR এর সংস্করণ উত্তর রেফারেন্সের জন্য

var myObj = {"you": 100, "me": 75, "foo": 116, "bar": 15};
keysSorted = Object.keys(myObj).sort((a,b) => myObj[a]-myObj[b])
alert(keysSorted);     // bar,me,you,foo

আপডেট: এপ্রিল 2017 - এটি myObjউপরে বর্ণিত একটি সাজানো বস্তুটি প্রদান করে।

Object
 .keys(myObj)
 .sort((a, b) => myObj[a]-myObj[b])
 .reduce((_sortedObj, key) => ({
   ..._sortedObj, 
   [key]: myObj[key]
 }), {})

এখানে চেষ্টা করুন!

আপডেট: অক্টোবর 2018 - অবজেক্ট.এন্ট্রি সংস্করণ

Object
 .entries(myObj)
 .sort()
 .reduce((_sortedObj, [k,v]) => ({
   ..._sortedObj, 
   [k]: v
 }), {})

এখানে চেষ্টা করুন!


1
এর জন্য কাজ করে নাvar myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
রোহানিল

5
এই প্রশ্নের উত্তর সহ ওপি-র প্রশ্নে নেস্টেড অবজেক্টগুলি নেই @ রোহানিল সম্ভবত আপনি ডাউন-ভোটিংয়ের পরিবর্তে অন্য প্রশ্ন জিজ্ঞাসা করতে চাইবেন। বিভিন্ন ধরণের আপনার নেস্টেড অবজেক্টের স্পষ্টতই এই সমাধানের চেয়ে আরও বেশি প্রয়োজন
জেসন জে নাথান

কেবল একটি নোট: আপনার আপডেটগুলি আসলে কাজ করবে না। কমপক্ষে সর্বত্র এবং না কারণ entries। স্ট্যান্ডার্ড অনুসারে, কোনও বস্তু হ'ল সম্পত্তিগুলির একটি সীমাহীন সংগ্রহ । ঠিক আছে, এর অর্থ যদি আপনি নতুন মানটিকে সম্পত্তির মান বা অন্য কোনও কিছু অনুসারে বাছাই করার পরে নির্মাণ করার চেষ্টা করছেন তবে সম্পত্তি কী ক্রমটি পুনরায় সংজ্ঞায়িত হয়ে যায়। উদাহরণস্বরূপ, ক্রোমটি সম্পত্তি কীগুলি অর্ডার করে ডিফল্ট হয়, সুতরাং এগুলি আলাদাভাবে অর্ডার করার প্রতিটি প্রচেষ্টা ব্যর্থ। আপনার একমাত্র সুযোগ হ'ল আপনার অর্ডারিং পছন্দগুলির উপর ভিত্তি করে একটি "সূচক" পাওয়া এবং সে অনুযায়ী মূল অবজেক্টটি অতিক্রম করা।
জোরগোজেড

হ্যাঁ @ জোড়গোজেড, আপনি ঠিক বলেছেন এবং অনেক লোক এই পোস্টে এটি উল্লেখ করেছে। বেশিরভাগ সময়, আমরা এই ফাংশনটি অন্য ধরণের (জেএসএন এর মতো) রূপান্তর করার আগে বা অন্য কোনও ফাংশন হ্রাস করার আগে রূপান্তর হিসাবে ব্যবহার করি। উদ্দেশ্য যদি এরপরে অবজেক্টটিকে রূপান্তরিত করা হয়, তবে অপ্রত্যাশিত ফলাফল হতে পারে। ইঞ্জিন জুড়ে এই ফাংশনটি নিয়ে আমার সাফল্য আছে।
জেসন জে নাথান

নোট: আপনি ব্যবহার করতে চাই না sort()উপরObject.entries()
Solvitieg

36

জাভাস্ক্রিপ্ট অবজেক্টগুলি সংজ্ঞা অনুসারে আনর্ডার্ড করা হয়েছে ( ECMAScript ভাষা নির্দিষ্টকরণ , বিভাগ 8.6 দেখুন)। ভাষার স্পেসিফিকেশন এমনকি গ্যারান্টি দেয় না, আপনি যদি ধারাবাহিকভাবে দু'বার বস্তুর বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি করেন, তবে তারা দ্বিতীয়বার একই ক্রমে বেরিয়ে আসবে।

আপনার যদি অর্ডার করার মতো জিনিসগুলির প্রয়োজন হয় তবে একটি অ্যারে এবং অ্যারে.প্রোটোটাইপ.সোর্ট পদ্ধতি ব্যবহার করুন।


4
নোট যে এটি সম্পর্কে বেশ কিছুটা বিতর্ক হয়েছে। বেশিরভাগ বাস্তবায়ন তালিকা যুক্ত করে যাতে উপাদান যুক্ত করা হয়। আইআইআরসি, ক্রোম দেয় না। অন্যান্য বাস্তবায়নগুলির সাথে ক্রোমের ক্রম হওয়া উচিত কিনা তা নিয়ে তর্ক ছিল। আমার বিশ্বাস একটি জাভাস্ক্রিপ্ট অবজেক্ট হ্যাশ এবং কোনও আদেশ অনুমান করা উচিত নয়। আমি বিশ্বাস করি পাইথন একই যুক্তি পেরিয়েছিল এবং সম্প্রতি একটি নতুন আদেশযুক্ত হ্যাশ-জাতীয় তালিকা চালু করা হয়েছিল। বেশিরভাগ ব্রাউজারের জন্য, আপনি নিজের অবজেক্টটি পুনরায় তৈরি করে, সাজানো মান দ্বারা উপাদান যুক্ত করে যা করতে চান তা করতে পারেন। তবে আপনার উচিত হবে না।
নসরেডনা

সম্পাদনা করুন। ক্রোম সাধারণত অর্ডার রাখে, তবে সবসময় হয় না। এবং এখানে সম্পর্কিত ক্রোমিয়াম বাগটি রয়েছে: কোড. google.com/p/chromium/issues/detail?id=883
নসরেডা

6
এই ত্রুটি প্রতিবেদনটি ন্যায়বিচারহীন এবং যারা অনাবন্ধিত আচরণের উপর নির্ভর করেছিল তারা হ'ল বাগগুলি। ECMASCript বিভাগ 8.6 পড়ুন; এটি পরিষ্কারভাবে বলেছে যে "একটি অবজেক্ট বৈশিষ্ট্যগুলির একটি নিরবচ্ছিন্ন সংগ্রহ"। যে কেউ খুঁজে পেয়েছিল যে কয়েকটি বাস্তবায়নে এটি সেভাবে মনে হয় নি, এবং তারপরে সেই বাস্তবায়ন-নির্দিষ্ট আচরণের উপর নির্ভর করতে শুরু করেছে, একটি বড় ভুল করেছে এবং তাদের দোষটি নিজের থেকে সরিয়ে দেওয়ার চেষ্টা করা উচিত নয়। আমি যদি ক্রোম দলে থাকি তবে আমি সেই বাগ প্রতিবেদনটিকে "অবৈধ, ওন্টফিক্স" হিসাবে চিহ্নিত করব।
নিকফিট্জ

8
ইকামাস্ক্রিপ্ট 5 প্রকৃতপক্ষে সন্নিবেশের ক্রম হিসাবে গণনার ক্রমকে সংজ্ঞায়িত করে - সংজ্ঞাটির অনুপস্থিতি ES3 তে একটি স্পষ্ট বাগ হিসাবে বিবেচিত হয়। এটি লক্ষণীয় যে ইকামাস্ক্রিপ্ট স্পেস আচরণটি এমনভাবে সংজ্ঞায়িত করে যে কেউ বুদ্ধিমান বিবেচনা করবে না - উদাহরণস্বরূপ অনুমান আচরণটি হ'ল সিনট্যাক্স ত্রুটিগুলি অনেক সময় রানটাইমের সময় নিক্ষেপ করা হয়, চালিয়ে যাওয়া, বিরতি, ++, - কনস্ট ইত্যাদির ভুল ব্যবহার হয় according সেই
কোডটিতে

4
@ ওলিজে - আমি মনে করি এটি সঠিক নয়। অনুমানটি বলে: "বৈশিষ্ট্য গণনা করার মেকানিক্স এবং ক্রম (প্রথম অ্যালগরিদমের 6.a পদক্ষেপ, দ্বিতীয়টিতে step.a পদক্ষেপ) নির্দিষ্ট করা হয়নি"। এটি চূড়ান্ত খসড়ার পিডিএফের 92 পৃষ্ঠায় রয়েছে।
হিটনিল্যান্ড

25

ঠিক আছে , আপনি জানেন যে, জাভাস্ক্রিপ্টে সাজানোর () ফাংশন রয়েছে, অ্যারেগুলি বাছাই করার জন্য, তবে অবজেক্টের জন্য কিছুই নেই ...

সুতরাং সেক্ষেত্রে আমাদের কিছুটা কীগুলির অ্যারে পাওয়া এবং সেগুলি বাছাই করা দরকার, কারণ এপিআই আপনাকে বেশিরভাগ সময় একটি অ্যারেতে অবজেক্ট দেয় তার কারণ, কারণ অ্যারে আক্ষরিক চেয়ে তার সাথে খেলতে আরও দেশীয় ফাংশন রয়েছে, যাইহোক, দ্রুত দ্রবণটি অবজেক্ট.কি ব্যবহার করছে যা অবজেক্ট কীগুলির একটি অ্যারের ফিরিয়ে দেয়, আমি নীচে ES6 ফাংশন তৈরি করি যা আপনার পক্ষে কাজ করে, এটি জাভাস্ক্রিপ্টে নেটিভ বাছাই () এবং হ্রাস () ফাংশন ব্যবহার করে:

function sortObject(obj) {
  return Object.keys(obj)
    .sort().reduce((a, v) => {
    a[v] = obj[v];
    return a; }, {});
}

এবং এখন আপনি এটি এর মতো ব্যবহার করতে পারেন:

let myObject = {a: 1, c: 3, e: 5, b: 2, d: 4};
let sortedMyObject = sortObject(myObject);

বাছাই করা মাইঅবজেক্টটি পরীক্ষা করুন এবং আপনি কীগুলি অনুসারে সাজানো ফলাফল দেখতে পারেন:

{a: 1, b: 2, c: 3, d: 4, e: 5}

এছাড়াও এইভাবে, মূল বস্তুকে স্পর্শ করা হবে না এবং আমরা আসলে একটি নতুন অবজেক্ট পাচ্ছি।

ফাংশনটি আরও সুস্পষ্ট করার জন্য আমি নীচের চিত্রটিও তৈরি করেছি, যদি আপনার নিজের মতো করে কাজ করতে আপনার কিছুটা পরিবর্তন করতে হয়:

জাভাস্ক্রিপ্ট অবজেক্টটি সম্পত্তি মান অনুসারে বাছাই করা হচ্ছে


4
মান অনুসারে নয়, কী অনুসারে এই সাজান।
রোররিওরর

@ রুরোরিওর, এটি কেবল এটিই ইঙ্গিত দেয় যে এটি কীভাবে কাজ করে যেমন তারা আলাদা নয় তবে সব ভাল, আমি মান অনুসারে
আলিরেজা

1
মান অনুসারে বাছাই করা ভুল এবং এটি আপনার ডেটাসেট। পরিবর্তন c: 3করুনc: 13 এবং আপনি দেখতে পাবেন এটি একেবারে বিচ্ছিন্ন হয়ে পড়েছে।
ভিটিওকর্লিওন

1
@ ভ্টোকর্লিওন এটি কেবল একটি প্রাকৃতিক বাছাইয়ের ত্রুটি, 1 প্রথম আসে, উপস্থাপিত হিসাবে অ্যালগরিদমের কোনও ত্রুটি নয়।
মাইকেল রায়ান সোইলিও

10
var list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

function sortAssocObject(list) {
    var sortable = [];
    for (var key in list) {
        sortable.push([key, list[key]]);
    }
    // [["you",100],["me",75],["foo",116],["bar",15]]

    sortable.sort(function(a, b) {
        return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0));
    });
    // [["bar",15],["me",75],["you",100],["foo",116]]

    var orderedList = {};
    for (var idx in sortable) {
        orderedList[sortable[idx][0]] = sortable[idx][1];
    }

    return orderedList;
}

sortAssocObject(list);

// {bar: 15, me: 75, you: 100, foo: 116}

সহজ এবং নিখুঁত! এই প্রশ্নের উত্তর। ধন্যবাদ।
অজয় সিং 15

জাভাস্ক্রিপ্টে কী অর্ডারটি গ্যারান্টিযুক্ত নয় তাই কীগুলি পূর্ণসংখ্যা বা এর মতো হলে আমার পক্ষে এটি ব্যর্থ হয়
পারক্স

ঠিক, পারক্স কীটি পূর্ণসংখ্যার ধরণের হলে এটি সঠিকভাবে কাজ করছে না।
Jangwon Jin

8

ES6 এর সাথে আপডেট করুন: যদি আপনার উদ্বেগের মধ্যে পুনরাবৃত্তি হওয়ার জন্য কোনও সাজানো অবজেক্ট থাকে (যার কারণেই আমি ভাবতে চাই যে আপনি নিজের অবজেক্টের বৈশিষ্ট্যগুলি সাজিয়ে রাখতে চান), আপনি মানচিত্র অবজেক্টটি ব্যবহার করতে পারেন ।

আপনি আপনার (কী, মান) জোড়াটি বাছাই করা ক্রমে সন্নিবেশ করতে পারেন এবং তারপরে একটি for..ofলুপ করলে গ্যারান্টি দেওয়া হবে আপনি যেভাবে সন্নিবেশ করিয়েছেন তাতে লুপ হবে

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// 0 = zero 
// 1 = one

এছাড়াও ES6 (ES2015): অবজেক্ট বৈশিষ্ট্যাবলী না ক্রম (অথবা সেখানে একটি নির্ধারিত অনুক্রমে তাদের অ্যাক্সেস দেখুন আপনার পয়েন্ট উপর নির্ভর করে একটি উপায় যায়)। যদি সম্পত্তির নামগুলি স্ট্রিং হয় এবং অ্যারে সূচকগুলির মতো না দেখায়, ক্রমটি সেই বস্তুর সাথে যুক্ত হওয়া ক্রম। এ নির্দেশ কি না দ্বারা সম্মানিত করা নিদিষ্ট for-inবা Object.keys, কিন্তু এটা করা হয় দ্বারা সম্মানিত করা সংজ্ঞায়িত Object.getOwnPropertyNamesসম্পত্তি নাম অ্যারে ব্যবহার করার জন্য এবং অন্যান্য নতুন পদ্ধতি। সুতরাং যে অন্য বিকল্প।
টিজে ক্রাউডার

কিন্তু 'সাজানো' অপারেশন কোথায়? এগুলি মোটেও সাজানো হয় না
সবুজ

@ গ্রীন আমি মনে করি আমি এখানে হাইলাইট করতে চেয়েছিলাম তা হ'ল, Mapআপনার কাছে আসলে এমন একটি ডেটা কাঠামো রয়েছে যা সাজানো ক্রমে (আপনার ডেটাটিকে সাজিয়ে তোলা যায় এবং এটি মানচিত্রে সংরক্ষণ করতে পারে) যেখানে আপনার গ্যারান্টি নেই অবজেক্ট।
জুলিয়ানালজক

6

উন্নত অ্যারে বা অবজেক্টের ধরণের জন্য ইন্ডোরস্কোর.জেএস বা লোডাশ.জেএস

 var data={
        "models": {

            "LTI": [
                "TX"
            ],
            "Carado": [
                "A",
                "T",
                "A(пасс)",
                "A(груз)",
                "T(пасс)",
                "T(груз)",
                "A",
                "T"
            ],
            "SPARK": [
                "SP110C 2",
                "sp150r 18"
            ],
            "Autobianchi": [
                "A112"
            ]
        }
    };

    var arr=[],
        obj={};
    for(var i in data.models){
      arr.push([i, _.sortBy(data.models[i],function (el){return el;})]);
    }
    arr=_.sortBy(arr,function (el){
      return el[0];
    });
    _.map(arr,function (el){return obj[el[0]]=el[1];});
     console.log(obj);

ডেমো


5

আমি slebetman দ্বারা প্রদত্ত সমাধান অনুসরণ করছি (সমস্ত বিবরণের জন্য এটি পড়ুন), তবে সমন্বয় করা হয়েছে, যেহেতু আপনার অবজেক্টটি অনিরাপদ

// First create the array of keys/values so that we can sort it:
var sort_array = [];
for (var key in list) {
    sort_array.push({key:key,value:list[key]});
}

// Now sort it:
sort_array.sort(function(x,y){return x.value - y.value});

// Now process that object with it:
for (var i=0;i<sort_array.length;i++) {
    var item = list[sort_array[i].key];

    // now do stuff with each item
}


4

একাধিক ফর-লুপ ছাড়াই মানগুলি বাছাই করুন (কী অনুসারে বাছাই করার জন্য সাজানোর কলব্যাকের সূচককে "0" এ পরিবর্তন করুন)

const list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
  };

let sorted = Object.fromEntries(
                Object.entries(list).sort( (a,b) => a[1] - b[1] )    
             ) 
console.log('Sorted object: ', sorted) 


2

এটি সত্যিকার অর্ডার করা বস্তু হিসাবে এটি হ্যান্ডেল করার সহজ উপায় হতে পারে। এটি কত ধীর গতির তা নিশ্চিত নয়। কিছুক্ষণ লুপ দিয়ে ভাল হতে পারে।

Object.sortByKeys = function(myObj){
  var keys = Object.keys(myObj)
  keys.sort()
  var sortedObject = Object()
  for(i in keys){
    key = keys[i]
    sortedObject[key]=myObj[key]
   }

  return sortedObject

}

এবং তারপরে আমি এই উল্টানো কার্যটি পেয়েছি: http://nelsonwells.net/2011/10/swap-object-key-and-values-in- জাভাস্ক্রিপ্ট /

Object.invert = function (obj) {

  var new_obj = {};

  for (var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      new_obj[obj[prop]] = prop;
    }
  }

  return new_obj;
};

সুতরাং

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var invertedList = Object.invert(list)
var invertedOrderedList = Object.sortByKeys(invertedList)
var orderedList = Object.invert(invertedOrderedList)

2
a = { b: 1, p: 8, c: 2, g: 1 }
Object.keys(a)
  .sort((c,b) => {
    return a[b]-a[c]
  })
  .reduce((acc, cur) => {
    let o = {}
    o[cur] = a[cur]
    acc.push(o)
    return acc
   } , [])

আউটপুট = [{পি: 8}, {সি: 2}, {বি: 1}, {জি: 1}]


2

কেবলমাত্র, কেউ @ মার্কাস আর এবং জেমস মুরান মন্তব্য দ্বারা কোড রেফারেন্সটি ব্যবহার করে (কী এবং মান সহ) বস্তুটি রাখার সন্ধান করছে, কেবলমাত্র এটি ব্যবহার করুন:

var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var newO = {};
Object.keys(list).sort(function(a,b){return list[a]-list[b]})
                 .map(key => newO[key] = list[key]);
console.log(newO);  // {bar: 15, me: 75, you: 100, foo: 116}

2
আপনি এতে একটি অ্যাসাইনমেন্ট ফিরিয়ে দিচ্ছেন map, forEachআরও ভাল হবে
ডিয়েগোআরাকেরো


1

অনেক অনুরূপ এবং দরকারী ফাংশন: https://github.com/shimondoodkin/groupbyfunifications/

function sortobj(obj)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        if(a[1]>b[1]) return -1;if(a[1]<b[1]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}

function sortobjkey(obj,key)
{
    var keys=Object.keys(obj);
    var kva= keys.map(function(k,i)
    {
        return [k,obj[k]];
    });
    kva.sort(function(a,b){
        k=key;      if(a[1][k]>b[1][k]) return -1;if(a[1][k]<b[1][k]) return 1;
        return 0
    });
    var o={}
    kva.forEach(function(a){ o[a[0]]=a[1]})
    return o;
}

1

মান অনুসারে বাছাই করা বস্তু (DESC)

function sortObject(list) {
  var sortable = [];
  for (var key in list) {
    sortable.push([key, list[key]]);
  }

  sortable.sort(function(a, b) {
    return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0));
  });

  var orderedList = {};
  for (var i = 0; i < sortable.length; i++) {
    orderedList[sortable[i][0]] = sortable[i][1];
  }

  return orderedList;
}

1

এখানে আরও একটি উদাহরণ দেওয়া হল:

function sortObject(obj) {
  var arr = [];
  var prop;
  for (prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      arr.push({
        'key': prop,
        'value': obj[prop]
      });
    }
  }
  arr.sort(function(a, b) {
    return a.value - b.value;
  });
  return arr; // returns array
}
var list = {
  car: 300,
  bike: 60,
  motorbike: 200,
  airplane: 1000,
  helicopter: 400,
  rocket: 8 * 60 * 60
};
var arr = sortObject(list);
console.log(arr);


1
    var list = {
    "you": 100,
    "me": 75,
    "foo": 116,
    "bar": 15
};
var tmpList = {};
while (Object.keys(list).length) {
    var key = Object.keys(list).reduce((a, b) => list[a] > list[b] ? a : b);
    tmpList[key] = list[key];
    delete list[key];
}
list = tmpList;
console.log(list); // { foo: 116, you: 100, me: 75, bar: 15 }

1

টাইপরাইটারে মুদ্রি

নিম্নলিখিত ফাংশনটি মান বা মানের দ্বারা সম্পত্তি সাজায়। আপনি যদি টাইপস্ক্রিপ্ট ব্যবহার না করেন তবে টাইপ তথ্যটিকে জাভাস্ক্রিপ্টে রূপান্তর করতে আপনি মুছে ফেলতে পারেন।

/**
 * Represents an associative array of a same type.
 */
interface Dictionary<T> {
  [key: string]: T;
}

/**
 * Sorts an object (dictionary) by value or property of value and returns
 * the sorted result as a Map object to preserve the sort order.
 */
function sort<TValue>(
  obj: Dictionary<TValue>,
  valSelector: (val: TValue) => number | string,
) {
  const sortedEntries = Object.entries(obj)
    .sort((a, b) =>
      valSelector(a[1]) > valSelector(b[1]) ? 1 :
      valSelector(a[1]) < valSelector(b[1]) ? -1 : 0);
  return new Map(sortedEntries);
}

ব্যবহার

var list = {
  "one": { height: 100, weight: 15 },
  "two": { height: 75, weight: 12 },
  "three": { height: 116, weight: 9 },
  "four": { height: 15, weight: 10 },
};

var sortedMap = sort(list, val => val.height);

একটি জাভাস্ক্রিপ্ট অবজেক্টে কী ক্রমের গ্যারান্টিযুক্ত নয়, তাই আমি ফলাফলটি বাছাই করে এবং এ হিসাবে ফিরিয়ে দিচ্ছি Map অবজেক্ট যা সাজানোর ক্রম সংরক্ষণ করে।

যদি আপনি এটিকে আবার অবজেক্টে রূপান্তর করতে চান তবে আপনি এটি করতে পারেন:

var sortedObj = {} as any;
sortedMap.forEach((v,k) => { sortedObj[k] = v });

1

ইনপুট হ'ল অবজেক্ট, আউটপুট অবজেক্ট, লোড্যাশ & জেএস বিল্ট-ইন লিব ব্যবহার করে অবতরণ বা আরোহণের বিকল্প সহ এবং ইনপুট অবজেক্টটিকে রূপান্তরিত করে না

যেমন ইনপুট এবং আউটপুট

{
  "a": 1,
  "b": 4,
  "c": 0,
  "d": 2
}
{
  "b": 4,
  "d": 2,
  "a": 1,
  "c": 0
}

রুপায়ণ

const _ = require('lodash');

const o = { a: 1, b: 4, c: 0, d: 2 };


function sortByValue(object, descending = true) {
  const { max, min } = Math;
  const selector = descending ? max : min;

  const objects = [];
  const cloned = _.clone(object);

  while (!_.isEmpty(cloned)) {
    const selectedValue = selector(...Object.values(cloned));
    const [key, value] = Object.entries(cloned).find(([, value]) => value === selectedValue);

    objects.push({ [key]: value });
    delete cloned[key];
  }

  return _.merge(...objects);
}

const o2 = sortByValue(o);
console.log(JSON.stringify(o2, null, 2));

1
const arrayOfObjects = [
{name: 'test'},
{name: 'test2'}
]

const order = ['test2', 'test']

const setOrder = (arrayOfObjects, order) =>
    arrayOfObjects.sort((a, b) => {
        if (order.findIndex((i) => i === a.name) < order.findIndex((i) => i === b.name)) {
            return -1;
        }

        if (order.findIndex((i) => i === a.name) > order.findIndex((i) => i === b.name)) {
            return 1;
        }

        return 0;
    });

1

সাজানোর সাথে আমার সমাধান:

let list = {
    "you": 100, 
    "me": 75, 
    "foo": 116, 
    "bar": 15
};

let sorted = Object.entries(list).sort((a,b) => a[1] - b[1]);

for(let element of sorted) {
    console.log(element[0]+ ": " + element[1]);
}

দয়া করে আপনার কোডটি কোড হিসাবে ফর্ম্যাট করুন
ইতমার মুশকিন

1
<pre>
function sortObjectByVal(obj){  
var keysSorted = Object.keys(obj).sort(function(a,b){return obj[b]-obj[a]});
var newObj = {};
for(var x of keysSorted){
    newObj[x] = obj[x];
}
return newObj;

}
var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
console.log(sortObjectByVal(list));
</pre>

1
স্ট্যাকওভারফ্লোতে স্বাগতম। আপনি যে জবাব দিয়েছেন তা ছাড়াও দয়া করে কেন এবং কীভাবে এটি সমস্যার সমাধান করে তার সংক্ষিপ্ত বিবরণ দেওয়ার জন্য দয়া করে বিবেচনা করুন।

0

এটি সমাধানের আর একটি উপায়: -

var res = [{"s1":5},{"s2":3},{"s3":8}].sort(function(obj1,obj2){ 
 var prop1;
 var prop2;
 for(prop in obj1) {
  prop1=prop;
 }
 for(prop in obj2) {
  prop2=prop;
 }
 //the above two for loops will iterate only once because we use it to find the key
 return obj1[prop1]-obj2[prop2];
});

// রেজাল্টের ফলাফল অ্যারে হবে


0

আপনাকে ধন্যবাদ এবং উত্তর নোসরেডেনাকে অবিরত করুন

এখন আমরা বুঝতে পারি যে অবজেক্টটিকে অ্যারেতে রূপান্তর করা দরকার তারপরে অ্যারে বাছাই করুন। এটি স্ট্রিং দ্বারা অ্যারে (বা অ্যারেতে রূপান্তরিত বস্তু) বাছাই করার জন্য দরকারী:

Object {6: Object, 7: Object, 8: Object, 9: Object, 10: Object, 11: Object, 12: Object}
   6: Object
   id: "6"
   name: "PhD"
   obe_service_type_id: "2"
   __proto__: Object
   7: Object
   id: "7"
   name: "BVC (BPTC)"
   obe_service_type_id: "2"
   __proto__: Object


    //Sort options
    var sortable = [];
    for (var vehicle in options)
    sortable.push([vehicle, options[vehicle]]);
    sortable.sort(function(a, b) {
        return a[1].name < b[1].name ? -1 : 1;
    });


    //sortable => prints  
[Array[2], Array[2], Array[2], Array[2], Array[2], Array[2], Array[2]]
    0: Array[2]
    0: "11"
    1: Object
        id: "11"
        name: "AS/A2"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2
        __proto__: Array[0]
    1: Array[2]
    0: "7"
    1: Object
        id: "7"
        name: "BVC (BPTC)"
        obe_service_type_id: "2"
        __proto__: Object
        length: 2

0

এটা চেষ্টা কর. এমনকি আপনার অবজেক্টটিরও সম্পত্তি নেই যার ভিত্তিতে আপনি বাছাই করার চেষ্টা করছেন সেটিও হ্যান্ডেল হয়ে যাবে।

কেবল বস্তুর সাথে সম্পত্তি প্রেরণ করে এটি কল করুন।

var sortObjectByProperty = function(property,object){

    console.time("Sorting");
    var  sortedList      = [];
         emptyProperty   = [];
         tempObject      = [];
         nullProperty    = [];
    $.each(object,function(index,entry){
        if(entry.hasOwnProperty(property)){
            var propertyValue = entry[property];
            if(propertyValue!="" && propertyValue!=null){
              sortedList.push({key:propertyValue.toLowerCase().trim(),value:entry});  
            }else{
                emptyProperty.push(entry);
           }
        }else{
            nullProperty.push(entry);
        }
    });

      sortedList.sort(function(a,b){
           return a.key < b.key ? -1 : 1;
         //return a.key < b.key?-1:1;   // Asc 
         //return a.key < b.key?1:-1;  // Desc
      });


    $.each(sortedList,function(key,entry){
        tempObject[tempObject.length] = entry.value;
     });

    if(emptyProperty.length>0){
        tempObject.concat(emptyProperty);
    }
    if(nullProperty.length>0){
        tempObject.concat(nullProperty);
    }
    console.timeEnd("Sorting");
    return tempObject;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.