কী দ্বারা জাভাস্ক্রিপ্ট অবজেক্টটি বাছাই করুন


532

আমি জাভাস্ক্রিপ্ট অবজেক্টগুলি কী অনুসারে বাছাই করতে চাই।

সুতরাং নিম্নলিখিত:

{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }

হবে:

{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }


38
২০১১ সালে ফিরে (যখন এই প্রশ্নটি পোস্ট করা হয়েছিল), ইসিএমএসক্রিপ স্পেস বলেছিল যে জাভাস্ক্রিপ্টের অবজেক্টগুলির অন্তর্নিহিত আদেশ নেই - পর্যবেক্ষণ করা আদেশ বাস্তবায়ন-নির্ভর ছিল এবং সুতরাং নির্ভর করা যায় না। যাইহোক, এটি সমস্ত জাভাস্ক্রিপ্ট ইঞ্জিনগুলি কম বেশি একই শব্দার্থবিজ্ঞানের প্রয়োগ করেছে, সুতরাং সেগুলি এখন ES6 এ মানক করা হয়েছে । ফলস্বরূপ, নীচের অনেকগুলি উত্তর অনুমান অনুসারে সঠিক হত তবে এখন ভুল are
ম্যাথিয়াস বাইনেস

শীঘ্রই বলছি যখন আপনার ফলাফলগুলি তুলনা বা হ্যাশ করতে হবে তখন স্ট্রিংফাই বাছাই করুন: npmjs.com/package/json-stable-stringify
এক্সবুক

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

নোট করুন যেহেতু Object.entriesএবং Object.fromEntriesজেএস-তে যুক্ত করা হয়েছে, এটি একটি দুর্দান্ত শর্ট ওয়ান-লাইনারের সাহায্যে অর্জন করা যেতে পারে:Object.fromEntries(Object.entries(obj).sort())
মাইক 'পোম্যাক্স' কামারম্যানস

উত্তর:


471

এই প্রশ্নের অন্য উত্তরগুলি পুরানো, বাস্তবায়নের বাস্তবতার সাথে আর কখনও মিলে না এবং ES6 / ES2015 স্পেস প্রকাশিত হওয়ার পরে এটি আনুষ্ঠানিকভাবে ভুল হয়ে গেছে।


দেখুন বিভাগে সম্পত্তি পুনরাবৃত্তির অর্ডার মধ্যে ES6 এক্সপ্লোরিং অ্যাক্সেল Rauschmayer দ্বারা :

সমস্ত বৈশিষ্ট্য যা সম্পত্তি কীগুলির মাধ্যমে পুনরাবৃত্তি হয় একই ক্রমে এটি করে:

  1. প্রথমে সমস্ত অ্যারে সূচকগুলি, সংখ্যা অনুসারে বাছাই করা।
  2. তারপরে সমস্ত স্ট্রিং কী (যেগুলি সূচকগুলি নয়), যাতে সেগুলি তৈরি করা হয়েছিল in
  3. তারপরে সমস্ত চিহ্ন, যেভাবে সেগুলি তৈরি করা হয়েছিল

হ্যাঁ, জাভাস্ক্রিপ্ট অবজেক্টগুলি হয় আসলে আদেশ, এবং তাদের কি অর্ডার / বৈশিষ্ট্য পরিবর্তন করা যাবে না।

বর্ণের ভিত্তিতে আপনি কী কীভাবে কোনও কী কী / বৈশিষ্ট্য অনুসারে বাছাই করতে পারেন তা এখানে:

const unordered = {
  'b': 'foo',
  'c': 'bar',
  'a': 'baz'
};

console.log(JSON.stringify(unordered));
// → '{"b":"foo","c":"bar","a":"baz"}'

const ordered = {};
Object.keys(unordered).sort().forEach(function(key) {
  ordered[key] = unordered[key];
});

console.log(JSON.stringify(ordered));
// → '{"a":"baz","b":"foo","c":"bar"}'

ES5 ইঞ্জিনগুলির সাথে সামঞ্জস্যের varপরিবর্তে ব্যবহার করুন const


5
আমি আপনার কোডের এবং এখানে সামান্য পৃথক লুপিং কৌশলটি ব্যবহার করার পরিবর্তে শীর্ষ উত্তরগুলির মধ্যে একটি পার্থক্য দেখতে পাচ্ছি না। অবজেক্টগুলিকে "অর্ডার" বলা যেতে পারে বা না তা অপ্রাসঙ্গিক বলে মনে হয়। এই প্রশ্নের উত্তর এখনও একই। প্রকাশিত অনুমানটি কেবল এখানে উত্তরগুলি নিশ্চিত করে।
ফিল

6
এফওয়াইআই, এটি স্পষ্ট করে জানিয়েছিল যে সম্পত্তিগুলির গণনার ক্রমটি
ফেলিক্স ক্লিং

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

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

1
দয়া করে যুক্ত করুন যে এই সমাধানটি বিভিন্ন আধুনিক ব্রাউজারগুলির দ্বারা সমর্থিত নয় (গুগল "ক্যানিজ ইএস 6")। এই উত্তরগুলি ব্যবহার করা কেবলমাত্র নির্দিষ্ট ব্রাউজারগুলিতেই হার্ড-টু-বাগের ঝুঁকির ঝুঁকি নিয়ে থাকে (যেমন ক্রোম যখন সমস্ত ঠিক থাকে তখন সাফারি)।
ম্যানুয়েল আরউড শ্মিড্ট

244

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

var myObj = {
    'b': 'asdsadfd',
    'c': 'masdasaf',
    'a': 'dsfdsfsdf'
  },
  keys = [],
  k, i, len;

for (k in myObj) {
  if (myObj.hasOwnProperty(k)) {
    keys.push(k);
  }
}

keys.sort();

len = keys.length;

for (i = 0; i < len; i++) {
  k = keys[i];
  console.log(k + ':' + myObj[k]);
}


Object.keysকল্পতা ব্যবহার করে বিকল্প বাস্তবায়ন :

var myObj = {
    'b': 'asdsadfd',
    'c': 'masdasaf',
    'a': 'dsfdsfsdf'
  },
  keys = Object.keys(myObj),
  i, len = keys.length;

keys.sort();

for (i = 0; i < len; i++) {
  k = keys[i];
  console.log(k + ':' + myObj[k]);
}


1 পেডেন্টিক হতে হবে না, তবে জেএসওএন অবজেক্টের মতো কোনও জিনিস নেই


2
@ মার্সেলকর্পেল জেএসওএন অবজেক্টের মতো জিনিস রয়েছে। অফিসিয়াল জেএসএন
পল

8
@ আরএফসি সম্পর্কে পলপ্রো দুটি বিষয় লক্ষণীয়: প্রথমত, এই মুহুর্তে এটি 7 বছরের পুরানো, এবং সময়ের সাথে সাথে শব্দভান্ডার পরিবর্তন হয়; দ্বিতীয়টি, "এই মেমোটি ইন্টারনেট সম্প্রদায়ের জন্য তথ্য সরবরাহ করে It এটি কোনও ধরণের ইন্টারনেট মান নির্দিষ্ট করে না।" অক্ষরের একটি প্রদত্ত ক্রম জাভাস্ক্রিপ্ট অবজেক্টের আক্ষরিক বা JSON পাঠ্যকে উপস্থাপন / ব্যবহারের উপর নির্ভর করে কিনা। "JSON অবজেক্ট" শব্দটি ক্ষতিকারক উপায়ে পার্থক্যটিকে অস্পষ্ট করে তোলে। আসুন অনর্থক পরিভাষা থেকে মুক্তি পাওয়া যাক এবং যেখানে সম্ভব সেখানে আরও সুনির্দিষ্ট শব্দটি ব্যবহার করুন। আমি অন্যথায় করার কোন কারণ দেখতে পাচ্ছি না। শব্দের বিষয়।
ম্যাট বল

6
@MattBall আইএমও JSON বস্তু মত একটি স্ট্রিং জন্য একটি খুব সুনির্দিষ্ট শব্দ {"a", 1}ঠিক যেমন তাদেরকে JSON এরে মত একটি স্ট্রিং এর জন্য সুনির্দিষ্ট শব্দ [1]। আপনার স্ট্রিং থাকা অবস্থায় আমার অ্যারেতে তৃতীয় অবজেক্টের মতো জিনিস বলে কথা বলতে সক্ষম হওয়া কার্যকর [{x: 1}, {y: 2}, {z: 3}], তাই জাভাস্ক্রিপ্টের আক্ষরিক সম্পর্কে মন্তব্য করার সময় আমি অনেকটা "এটি কোনও জেএসওএন অবজেক্ট নয়" পছন্দ করি, তারপরে "এর পরে তেমন কিছুই নেই" একটি জেএসওএন অবজেক্ট হিসাবে জিনিস ", এটি যখন ওপি আসলে জেএসওনের সাথে কাজ করছে তখন পরে আরও বিভ্রান্তি এবং যোগাযোগের সমস্যার কারণ হতে চলেছে।
পল

3
@ পোলপ্রো আমাকে অবশ্যই দ্বিমত পোষণ করবেন। {"a", 1}হয় বস্তু আক্ষরিক বা একটি JSON পাঠ্য (ওরফে JSON স্ট্রিং, যদি আপনি সত্যিই পছন্দ করেন)। এটি প্রসঙ্গের উপর নির্ভর করে, পূর্ববর্তীটি যদি জাভাস্ক্রিপ্ট উত্স কোডের মধ্যে ভারব্যাটিম প্রদর্শিত হয়, তবে এটি যদি পরে থাকে তবে এটি যদি স্ট্রিং থাকে যা JSON পার্সারে আরও ব্যবহার করার প্রয়োজন হয়। দু'জনের মধ্যে আসল পার্থক্য রয়েছে যখন এটির জন্য সিনট্যাক্স, সঠিক ব্যবহার এবং সিরিয়ালাইজেশন অনুমোদিত হয়।
ম্যাট বল

4
এখন যেহেতু ES6 / ES2015 চূড়ান্ত হয়েছে, এই উত্তরটি আনুষ্ঠানিকভাবে ভুল হয়ে গেছে। আরও তথ্যের জন্য আমার উত্তর দেখুন।
ম্যাথিয়াস বাইনেস

171

অনেক লোক উল্লেখ করেছেন যে "অবজেক্টগুলি বাছাই করা যায় না" তবে এর পরে তারা আপনাকে একটি সমাধান দিচ্ছে যা কাজ করে। প্যারাডক্স, তাই না?

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

এবং আমি মনে করি যে আমরা আরও একটি সমাধান যোগ করতে পারি - ES5 কার্যকরী উপায়:

function sortObject(obj) {
    return Object.keys(obj).sort().reduce(function (result, key) {
        result[key] = obj[key];
        return result;
    }, {});
}

ES2015 এর উপরের সংস্করণ ("ওয়ান-লাইনার" এ ফর্ম্যাট করা):

const sortObject = o => Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {})

উপরোক্ত উদাহরণগুলির সংক্ষিপ্ত বিবরণ (যেমন মন্তব্যগুলিতে বলা হয়েছে):

Object.keysপ্রদত্ত বস্তুতে ( objবা o) কীগুলির একটি তালিকা আমাদের দিচ্ছে , তারপরে আমরা ডিফল্ট বাছাই করা অ্যালগরিদম ব্যবহার করে বাছাই করছি, এর পরেরটি .reduceঅ্যারেটিকে কোনও অবজেক্টে রূপান্তর করতে ব্যবহার করা হবে, তবে এই বারে বাছাই করা সমস্ত কী দিয়ে।


7
@ পয়েন্টি এই আচরণটি সবসময় সমস্ত বড় ব্রাউজারগুলিতে পাওয়া যায় এবং ES6 / ES2015 এ মানক করা হয়েছে । আমি বলতে চাই এটি ভাল পরামর্শ।
ম্যাথিয়াস বাইনেস

3
এটি ইকমাস্ক্রিপ্ট ভি 5-তে কার্য সম্পাদনের সহজতম এবং সংক্ষিপ্ত উপায়। পার্টিতে কিছুটা দেরি হলেও গ্রহণযোগ্য উত্তর হওয়া উচিত।
স্টিভেন ডি সালাস

2
"এগুলি হ'ল, কারণ বেশিরভাগ ব্রাউজারের বাস্তবায়নের মানগুলিতে অবজেক্টগুলিতে সেগুলি ক্রমে সংরক্ষণ করা হয়" কেবলমাত্র অ-সংখ্যাগত বৈশিষ্ট্যের জন্য। এছাড়াও মনে রাখবেন যে এখনও কোন গ্যারান্টি নেই যাতে সম্পত্তি ক্রম (যেমন মাধ্যমে for...in) পুনরাবৃত্তি হয় ।
ফেলিক্স ক্লিং

2
এটি কেন কাজ করছে তা ব্যাখ্যা করার জন্য আপনার খুব ভালো লাগছিল me ধন্যবাদ!
ওলা

5
আমার লিন্টার সেই ওয়ান-লাইনার সম্পর্কে অভিযোগ করেছে (একটি কার্যভার ফেরত) তবে এটি আমার পক্ষে কাজ করে এবং আমার পক্ষে এটি পড়া সহজ হয়:Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
aks।

68

বলছি আমি রূপকভাবে হতবাক! অবশ্যই সমস্ত উত্তর কিছুটা পুরানো, তবে কেউ বাছাইয়ের স্থায়িত্বের কথাও উল্লেখ করেনি! সুতরাং আমার সাথে সহ্য করুন আমি নিজেই প্রশ্নের উত্তর দেওয়ার জন্য যথাসাধ্য চেষ্টা করব এবং এখানে বিশদে যাব। তাই আমি এখন ক্ষমা চাইতে চলেছি এটি পড়ার অনেক কিছুই হবে be

যেহেতু এটি 2018 হ'ল আমি কেবল ES6 ব্যবহার করব, তাই পলিফিলগুলি এমডিএন ডক্সে উপলভ্য, যা আমি প্রদত্ত অংশে লিঙ্ক করব।


প্রশ্নের উত্তর দাও:

যদি আপনার কীগুলি কেবলমাত্র সংখ্যা হয় তবে আপনি বাছাই করা বস্তুটি ফেরত দিতে নিরাপদে Object.keys()একসাথে ব্যবহার Array.prototype.reduce()করতে পারেন:

// Only numbers to show it will be sorted.
const testObj = {
  '2000': 'Articel1',
  '4000': 'Articel2',
  '1000': 'Articel3',
  '3000': 'Articel4',
};

// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
  accumulator[currentValue] = testObj[currentValue];
  return accumulator;
}, {}));

/**
 * expected output:
 * {
 * '1000': 'Articel3',
 * '2000': 'Articel1',
 * '3000': 'Articel4',
 * '4000': 'Articel2' 
 *  } 
 */

// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));

তবে আপনি যদি স্ট্রিং নিয়ে কাজ করছেন তবে আমি Array.prototype.sort()এই সমস্তগুলিতে শৃঙ্খলাবদ্ধ হওয়ার সুপারিশ করছি :

// String example
const testObj = {
  'a1d78eg8fdg387fg38': 'Articel1',
  'z12989dh89h31d9h39': 'Articel2',
  'f1203391dhj32189h2': 'Articel3',
  'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
  accumulator[currentValue] = testObj[currentValue];
  return accumulator;
}, {}));

/**
 * expected output:   
 * { 
 * a1d78eg8fdg387fg38: 'Articel1',
 * b10939hd83f9032003: 'Articel4',
 * f1203391dhj32189h2: 'Articel3',
 * z12989dh89h31d9h39: 'Articel2' 
 * }
 */

// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));

যদি কেউ ভাবছেন যে কী হ্রাস করে:

// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)

// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback 
// (and another param look at the last line) and passes 4 arguments to it: 
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {

  // setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
  accumulator[currentValue] = testObj[currentValue];

  // returning the newly sorted object for the next element in array.
  return accumulator;

  // the empty object {} ist the initial value for  Array.prototype.reduce().
}, {});

এখানে যদি প্রয়োজন হয় তবে একটি লাইনারের জন্য ব্যাখ্যা:

Object.keys(testObj).reduce(

  // Arrow function as callback parameter.
  (a, c) => 

  // parenthesis return! so we can safe the return and write only (..., a);
  (a[c] = testObj[c], a)

  // initial value for reduce.
  ,{}
);

বাছাই কেন কিছুটা জটিল:

সংক্ষেপে Object.keys()আমরা একটি সাধারণ লুপের সাথে যেমন পাই তেমন আদেশের সাথে একটি অ্যারে ফিরিয়ে দেব:

const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]

অবজেক্ট.কিজ () এমন একটি অ্যারের প্রদান করে যার উপাদানগুলি স্ট্রিংগুলিতে সরাসরি বস্তুর উপরে পাওয়া অগণিত বৈশিষ্ট্যের সাথে মিল রাখে। বৈশিষ্ট্যগুলির ক্রম হ'ল ডিফল্টরূপে বস্তুর বৈশিষ্ট্যগুলি লুপ করে দেওয়া।

সিডিনোট - আপনি Object.keys()অ্যারেতেও ব্যবহার করতে পারেন , মনে রাখবেন সূচকটি ফিরে আসবে:

// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

তবে এই উদাহরণগুলির দ্বারা দেখানো যতটা সহজ নয়, বাস্তব বিশ্বের বস্তুতে সংখ্যা এবং বর্ণমালা বা এমনকি চিহ্ন থাকতে পারে (দয়া করে এটি করবেন না)।

এখানে একটিতে সমস্ত বস্তুর সাথে একটি উদাহরণ রয়েছে:

// This is just to show what happens, please don't use symbols in keys.
const testObj = {
  '1asc': '4444',
  1000: 'a',
  b: '1231',
  '#01010101010': 'asd',
  2: 'c'
};

console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]

এখন আমরা যদি Array.prototype.sort()আউটপুট পরিবর্তনের উপরে অ্যারে ব্যবহার করি :

console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]

দস্তাবেজের একটি উদ্ধৃতি এখানে:

বাছাই () পদ্ধতিটি একটি অ্যারের উপাদানগুলিকে স্থানে বাছাই করে অ্যারেটি দেয় returns বাছাই অগত্যা স্থিতিশীল নয়। ডিফল্ট সাজানোর ক্রমটি স্ট্রিং ইউনিকোড কোড পয়েন্ট অনুসারে হয়।

সাজানোর সময় এবং স্থান জটিলতার গ্যারান্টি দেওয়া যায় না কারণ এটি বাস্তবায়ন নির্ভর।

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


বড় চুক্তি কি তাই?

ওয়েল এখানে দুটি নিবন্ধ রয়েছে যা প্রতিটি প্রোগ্রামারকে বুঝতে হবে:

ইন-প্লেস অ্যালগরিদম :

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

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

বাছাই অ্যালগরিদম

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

এখানে চিত্র বর্ণনা লিখুন

কার্ড খেলতে স্থিতিশীল সাজানোর উদাহরণ। কার্ডগুলি যখন স্থিতিশীল বাছাইয়ের সাথে র‌্যাঙ্ক অনুসারে বাছাই করা হয়, দুটি 5 টি অবশ্যই মূলত সাজানো আউটপুটে একই ক্রমে থাকতে হবে they যখন তারা একটি অ-স্থিতিশীল সাজানোর মাধ্যমে বাছাই করা হয়, 5 টি বিপরীতে শেষ হতে পারে সাজানো আউটপুট ক্রম।

এটি দেখায় যে বাছাই করা ঠিক আছে তবে এটি পরিবর্তিত হয়েছে। সত্যিকারের বিশ্বে এমনকি বাছাই করা সঠিক হলেও আমাদের তা নিশ্চিত করতে হবে যে আমরা যা প্রত্যাশা করি তা পেয়েছি! এটি অত্যন্ত গুরুত্বপূর্ণ এটিও মনে রাখবেন। আরও জাভাস্ক্রিপ্ট উদাহরণের জন্য অ্যারে.প্রোটোটাইপ.সোর্ট () - ডক্সগুলি দেখুন: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অ্যারে / সার্ট


3
আপনি ফ্লিপিন শিলা, এই অবিশ্বাস্য উত্তরের জন্য আপনাকে ধন্যবাদ। আমি এসও-তে সবচেয়ে ভাল দেখেছি। চিয়ার্স।
গ্যাভিন

কেবলমাত্র যদি আপনি শেষে একটি freaking পদ্ধতি ব্যবহার করতে পারে। দুর্দান্ত উত্তর যদিও!
মিমি

@ মোমো সমস্যা হ'ল আপনি বাছাইয়ের প্রত্যাশার উপর নির্ভর করে সঠিক পদ্ধতি নেই। তবে আপনি কেবল আমার উত্তর থেকে কোড এই টুকরা ব্যবহার করতে পারেন: Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
মেগাজিন

এই প্রশ্নের জন্য কি বাছাইয়ের স্থায়িত্ব প্রযোজ্য নয়: আমরা বস্তু কী দ্বারা বাছাই করছি, এবং কীটি অনন্য। (আপনার কার্ডের উদাহরণটি প্রসারিত করার জন্য: প্যাকেটে কখনও কখনও দুটি 5s থাকতে পারে না, এমনকি সেগুলি বিভিন্ন স্যুটের হলেও হয়))
ড্যারেন কুক

@ ড্যারেনকুক ভাল প্রশ্ন! আপনি ঠিক বলেছেন কোনও বস্তুতে কখনই একই কী থাকবে না। তবে স্থিতিশীলতা একটি চাবির স্বতন্ত্রতার চেয়ে আরও জটিল। বেশিরভাগ সময় একটি অ্যারে জিনিস বাছাইয়ের অন্তর্ভুক্ত থাকে। এবং তখনই সমস্ত কিছু অস্থির হয়ে উঠতে পারে। 5 জন খেলোয়াড় নিয়ে একটি কার্ড গেমটি কল্পনা করুন। প্রতিটি হাত একটি অ্যারের দ্বারা প্রতিনিধিত্ব করা হয় (একটি পৃথক হাত বাছাই রাখা) এবং কার্ড হিসাবে বস্তু হিসাবে। আপনার কার্ড সৌন্দর্য এই চান {5: 'hearts'}বা {5: 'spades'}করতে এবং আপনার অ্যারের বাছাই শুরু এটা Rummy মত গেম এ সম্ভাব্য অস্থির হয়ে যাবে। বিভিন্ন ভাষায় কথা বলতে হবে না।
মেগাজিন

29

এটি আমার পক্ষে কাজ করে

/**
 * Return an Object sorted by it's Key
 */
var sortObjectByKey = function(obj){
    var keys = [];
    var sorted_obj = {};

    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            keys.push(key);
        }
    }

    // sort keys
    keys.sort();

    // create new array based on Sorted Keys
    jQuery.each(keys, function(i, key){
        sorted_obj[key] = obj[key];
    });

    return sorted_obj;
};

10
এটি আসলে হাতের প্রশ্নের সঠিক উত্তর। একটি সরলীকৃত সংস্করণ আন্ডারস্কোর ব্যবহার জন্য, দেখুন: jsfiddle.net/wPjaQ/1
radicand

6
@radicand এই উত্তরটি সঠিক নয়। এটি একটি নতুন অবজেক্ট ফিরিয়ে দেয়, যার কোনও অর্ডার নেই।
পল

3
@radicand এটি অনুশীলন করে না। কোনও অবজেক্ট কীগুলিতে অর্ডার বলে কোনও জিনিস নেই, সুতরাং আপনি কীভাবে বলতে পারেন যে বাস্তবে এটি আপনাকে একটি সাজানো ক্রমে একটি বস্তু দেয়? এটা সত্যিই শুধু আপনার বস্তুর অগভীর কপি আপনি পাস ব্যাক দেয়।
পল

9
এটি অত্যন্ত ভুল। এটি আপাতত কাজ করার জন্য ঘটতে পারে তবে একই ব্রাউজারে একটি ভিন্ন ওয়েব ব্রাউজার বা ভিন্ন পৃষ্ঠা লোডে ভেঙে যায়। সুরক্ষার জন্য ব্রাউজারগুলি অবজেক্ট কীগুলি এলোমেলো করে দিতে পারে, বা আপনি কোনও বস্তু পূরণ করার সাথে সাথে এটি কীগুলির উপর নির্ভর করে মানগুলিকে বিভিন্ন মেমরি বালতিতে রাখবে, যা ভিন্ন অর্ডারে ফিরে আসবে। যদি এটি কাজ করে তবে এটি আপনার পক্ষে ভাগ্যবান।
ইয়ুবার্ট

11
এটিতে jQuery এর অপ্রয়োজনীয় ব্যবহার রয়েছে।
রবজি

25

এটি 2019 এবং এর সমাধানের জন্য আমাদের 2019 টি উপায় রয়েছে :)

Object.fromEntries(Object.entries({b: 3, a:8, c:1}).sort())

2
কীভাবে আমরা নেস্টেড অবজেক্টগুলিকে কী অনুসারে বাছাই করব?
a2441918

@ a2441918 ঠিক তেমনভাবে আপনি সাজানোর () ফাংশনটি দিয়ে যাবেন। এক নজরে দেখুন: বিকাশকারী.মোজিলা.আর.ডে / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স /… অবজেক্ট.ফ্রমেট্রিটস (অবজেক্ট.এন্ট্রি ({বি: 3, এ: 8, সি: 1})। সাজান ((কে, জে ) => কে - জে))
ব্যবহারকারী 2912903

টাইপসক্রিপ্ট ব্যবহারকারীদের জন্য এটি এখনও আমাদের জন্য উপলভ্য নয়, দেখুন: github.com/microsoft/TypeScript/issues/30933
tsujp

চমৎকার ওয়ান-লাইনার, তবে কীগুলি কেস-সংবেদনশীল পদ্ধতিতে বাছাই করবেন?
ম্যাক্সেক্স

1
@ থেইম্যাক্সএক্স সাজানোর জন্য একটি কাস্টম ফাংশন ব্যবহার করুন, যেমন: `` `অবজেক্ট.ফ্রমেট্রিটস (অবজেক্ট.এন্ট্রি ({বি: 3, ক: 8, সি: 1})) সাজান (([কী 1, ভাল 1], [কী 2, ভাল 2]) => কী 1.to লোভারকেস ()। লোকেলকম্পার (কী 2.toLowerCase ()))) `` `
বেন

22

এখানে 1 লাইনার

var data = { zIndex:99,
             name:'sravan',
             age:25, 
             position:'architect',
             amount:'100k',
             manager:'mammu' };

console.log(Object.entries(data).sort().reduce( (o,[k,v]) => (o[k]=v,o), {} ));


হেক এই পাগল সিনট্যাক্স কি? (o[k] = v, o)। এটি এমনকি কেন কাজ করে, আমি এটি সম্পর্কে ডক্স কোথায় পাব? এটি স্পষ্টতই সঠিকতম প্যারামিটারটি দেয়, তবে কেন?
ntaso

1
@ নাস্তো এখানে
জেমস

সংক্ষিপ্ত ফাংশনটি প্রথমে o[k]সমান হয় vএবং তারপরে ফিরে আসেo
তাহসিন তুরকোজ

19

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

    Object.keys(unordered).sort().forEach(function(key) {
        var value = unordered[key];
        delete unordered[key];
        unordered[key] = value;
    });

কোড কার্যকর করার পরে, "অর্ডারড" অবজেক্টটিতে নিজেই কীগুলি বর্ণমালা অনুসারে বাছাই করা হবে।


17

লোডাশ ব্যবহার করে এটি কাজ করবে:

some_map = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }

// perform a function in order of ascending key
_(some_map).keys().sort().each(function (key) {
  var value = some_map[key];
  // do something
});

// or alternatively to build a sorted list
sorted_list = _(some_map).keys().sort().map(function (key) {
  var value = some_map[key];
  // return something that shall become an item in the sorted list
}).value();

চিন্তার জন্য শুধু খাবার।


15

ধরুন এটি ভিজ্যুয়াল স্টুডিও ডিবাগারে কার্যকর হতে পারে যা নিরক্ষিত বস্তুর বৈশিষ্ট্যগুলি দেখায়।

(function(s){var t={};Object.keys(s).sort().forEach(function(k){t[k]=s[k]});return t})({b:2,a:1,c:3})

তাই মহান ধন্যবাদ loooot
Mugiwara

নিস! এই সংক্ষিপ্ত সমাধানের জন্য আপনাকে ধন্যবাদ।
কন আন্তোনাকোস

9

অ্যান্ডস্কোর সংস্করণ :

function order(unordered)
{
return _.object(_.sortBy(_.pairs(unordered),function(o){return o[0]}));
}

কীগুলির ক্রম বজায় রাখার জন্য আপনি যদি আপনার ব্রাউজারটিকে বিশ্বাস না করেন, তবে আমি দৃ strongly়ভাবে কী-মানযুক্ত জোড়ার অ্যারে একটি আদেশযুক্ত অ্যারে নির্ভর করার পরামর্শ দিচ্ছি।

_.sortBy(_.pairs(c),function(o){return o[0]})

আরও ভাল:_.object(_.sortBy(_.pairs(unordered), _.first))
আফসানসি কুরাকিন

8
function sortObjectKeys(obj){
    return Object.keys(obj).sort().reduce((acc,key)=>{
        acc[key]=obj[key];
        return acc;
    },{});
}

sortObjectKeys({
    telephone: '069911234124',
    name: 'Lola',
    access: true,
});

আপনার কোডটির কিছু ব্যাখ্যা যুক্ত করা আরও ভাল।
এরিস্টটল

1
অবজেক্টের কীগুলি পাওয়া যায়, সুতরাং এটি স্ট্রিংগুলির অ্যারে, আমি তাদের বাছাই করি () এবং এটি স্ট্রিংগুলির (অ্যারে) হিসাবে অ্যারে হ'ল আমি তাদের হ্রাস করি (জেএস অ্যারের হ্রাস () সহ)। অভিযুক্তিটি শুরুর দিকে একটি খালি অবজেক্ট redu} (রিডুসারের শেষ আর্গ) হয় এবং রিডিউসার (কলব্যাক) শূন্য বস্তুটির উপর নির্দেশিত কী ক্রমের সাথে উত্সের মানগুলির মান নির্ধারণ করে।
ব্যবহারকারী 3286817

8

কিছুটা আরও মার্জিত ফর্ম হতে পারে:

 /**
     * Sorts a key-value object by key, maintaining key to data correlations.
     * @param {Object} src  key-value object
     * @returns {Object}
     */
var ksort = function ( src ) {
      var keys = Object.keys( src ),
          target = {};
      keys.sort();
      keys.forEach(function ( key ) {
        target[ key ] = src[ key ];
      });
      return target;
    };


// Usage
console.log(ksort({
  a:1,
  c:3,
  b:2  
}));

PS এবং ES6 + সিনট্যাক্স সহ একই:

function ksort( src ) {
  const keys = Object.keys( src );
  keys.sort();
  return keys.reduce(( target, key ) => {
        target[ key ] = src[ key ];
        return target;
  }, {});
};

এটা কিছু না। আপনি এখনও একটি জিনিস ফিরে। আপনি আপনার টার্গেটে থাকা অবজেক্টগুলিকে গ্যারান্টি দিতে পারবেন না আসলে কোনও আদেশ রয়েছে। আপনাকে একটি অ্যারে ফিরিয়ে দিতে হবে। jeeezus।
মিমি

আপনি এখানে কেবল যা করছেন তা হ'ল এটি একটি সেটটি নিশ্চিত করা, কোনও অনুকূল উপায় নয়।
মিমি

7

নেস্টেড অবজেক্ট এবং অ্যারেগুলির জন্য পুনরাবৃত্তিক সাজ

function sortObjectKeys(obj){
    return Object.keys(obj).sort().reduce((acc,key)=>{
        if (Array.isArray(obj[key])){
            acc[key]=obj[key].map(sortObjectKeys);
        }
        if (typeof obj[key] === 'object'){
            acc[key]=sortObjectKeys(obj[key]);
        }
        else{
            acc[key]=obj[key];
        }
        return acc;
    },{});
}

// test it
sortObjectKeys({
    telephone: '069911234124',
    name: 'Lola',
    access: true,
    cars: [
        {name: 'Family', brand: 'Volvo', cc:1600},
        {
            name: 'City', brand: 'VW', cc:1200, 
            interior: {
                wheel: 'plastic',
                radio: 'blaupunkt'
            }
        },
        {
            cc:2600, name: 'Killer', brand: 'Plymouth',
            interior: {
                wheel: 'wooden',
                radio: 'earache!'
            }
        },
    ]
});

আমি আপনার প্রয়োজন একটি মনে elseউভয়ের জন্য সত্য হতে পারে - সেখানে Array.isArray(obj[key])এবং জন্যtypeof obj[key] === 'object'
jononomo

আপনার যখন আদিমগুলির একটি অ্যারে থাকে, তখন আপনার ফাংশন আদিমগুলিকে (স্ট্রিং / সংখ্যা) খালি বস্তুতে রূপান্তর করে। এটি ধরতে আমি আপনার ফাংশনের শুরুতে নীচে ঠিক যুক্ত করেছি function sortObjectKeys(obj){:: if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }if(obj == null || obj == undefined){ return obj; }
দৃust়তার

4

ইতিমধ্যে উল্লিখিত হিসাবে, অবজেক্টগুলি সীমানাবিহীন।

যাহোক...

আপনি এই প্রতিমাটি দরকারী খুঁজে পেতে পারেন:

var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };

var kv = [];

for (var k in o) {
  kv.push([k, o[k]]);
}

kv.sort()

তারপরে আপনি কেভি দিয়ে পুনরাবৃত্তি করতে পারেন এবং যা ইচ্ছা তা করতে পারেন।

> kv.sort()
[ [ 'a', 'dsfdsfsdf' ],
  [ 'b', 'asdsad' ],
  [ 'c', 'masdas' ] ]


4

এখানে একটি পরিষ্কার লোডাশ-ভিত্তিক সংস্করণ যা নেস্টেড অবজেক্টগুলির সাথে কাজ করে

/**
 * Sort of the keys of an object alphabetically
 */
const sortKeys = function(obj) {
  if(_.isArray(obj)) {
    return obj.map(sortKeys);
  }
  if(_.isObject(obj)) {
    return _.fromPairs(_.keys(obj).sort().map(key => [key, sortKeys(obj[key])]));
  }
  return obj;
};

লোডাশের কোনও toObject()পদ্ধতি থাকলে এটি আরও পরিষ্কার হবে ...


3

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

আপনি যদি সাজ্টবাই মান পরিবর্তন জোড় সূচকটি 0 এর পরিবর্তে 1 এ পরিবর্তন করতে চান

var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
console.log(_(o).toPairs().sortBy(0).fromPairs().value())

এখানে চিত্র বর্ণনা লিখুন


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

3

রেফারেন্সগুলি সংরক্ষণ করার সময় কীগুলি পুনরাবৃত্তভাবে সাজান।

function sortKeys(o){
    if(o && o.constructor === Array)
        o.forEach(i=>sortKeys(i));
    else if(o && o.constructor === Object)
        Object.entries(o).sort((a,b)=>a[0]>b[0]?1:-1).forEach(e=>{
            sortKeys(e[1]);
            delete o[e[0]];
            o[e[0]] = e[1];
        });
}

উদাহরণ:

let x = {d:3, c:{g:20, a:[3,2,{s:200, a:100}]}, a:1};
let y = x.c;
let z = x.c.a[2];
sortKeys(x);
console.log(x); // {a: 1, c: {a: [3, 2, {a: 1, s: 2}], g: 2}, d: 3}
console.log(y); // {a: [3, 2, {a: 100, s: 200}}, g: 20}
console.log(z); // {a: 100, s: 200}

চমৎকার স্নিপেট! delete o[e[0]];সেখানে কি উদ্দেশ্য ? আমরা শুধু বরাদ্দ করতে পারি না?
বায়াং

দেখে মনে হচ্ছে অস্তিত্বযুক্ত কীগুলিতে কেবল নতুন অ্যাসাইনমেন্টই কীটি শেষে যুক্ত করবে। যদি মুছুন মন্তব্য করা হয়, কীগুলি বাছাই করা হবে না, কমপক্ষে Chrome এ নয়।
brunettdan

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

হ্যাঁ, কীগুলির ক্রম গুরুত্বপূর্ণ যখন আমি মানচিত্রটি ব্যবহার করি: বিকাশকারী.মোজিলা.আর.ইন-
ইউএস


3

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

function sortObj(obj) {
    if (typeof obj !== "object" || obj === null)
        return obj;

    if (Array.isArray(obj))
        return obj.map((e) => sortObj(e)).sort();

    return Object.keys(obj).sort().reduce((sorted, k) => {
        sorted[k] = sortObj(obj[k]);
        return sorted;
    }, {});
}

2

এই কোডটি ব্যবহার করুন যদি আপনার নেস্টেড অবজেক্ট থাকে বা যদি আপনি অ্যারে অবজেক্ট নেস্ট করেছেন।

var sortObjectByKey = function(obj){
    var keys = [];
    var sorted_obj = {};
    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            keys.push(key);
        }
    }
    // sort keys
    keys.sort();

    // create new array based on Sorted Keys
    jQuery.each(keys, function(i, key){
        var val = obj[key];
        if(val instanceof Array){
            //do for loop;
            var arr = [];
            jQuery.each(val,function(){
                arr.push(sortObjectByKey(this));
            }); 
            val = arr;

        }else if(val instanceof Object){
            val = sortObjectByKey(val)
        }
        sorted_obj[key] = val;
    });
    return sorted_obj;
};

5
লেখক এ কথাটি বলে না যে তিনি jQuery ব্যবহার করছেন, বা jQuery প্রশ্নযুক্ত নয়। আপনি খাঁটি জাভাস্ক্রিপ্টে কোনও সমাধান যুক্ত করলে ভাল লাগবে।
rusmus

ধন্যবাদ @ ফণীকে আমার যা প্রয়োজন তা হ'ল
উইল শেপার্ড

2

সমাধান:

function getSortedObject(object) {
  var sortedObject = {};

  var keys = Object.keys(object);
  keys.sort();

  for (var i = 0, size = keys.length; i < size; i++) {
    key = keys[i];
    value = object[key];
    sortedObject[key] = value;
  }

  return sortedObject;
}

// Test run
getSortedObject({d: 4, a: 1, b: 2, c: 3});

ব্যাখ্যা:

অনেক জাভাস্ক্রিপ্ট রানটাইমগুলি কোনও বস্তুর ভিতরে ক্রম যুক্ত করে সেগুলিতে মানগুলি সংরক্ষণ করে।

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

কীগুলি বাছাই হয়ে গেলে আপনি কোনও নতুন অবজেক্ট (যা এখন সাজানো হয়েছে) পূরণ করতে পুরানো অবজেক্টের বিষয়বস্তুগুলিতে অ্যাক্সেস পেতে একে অপরকে ব্যবহার শুরু করতে পারেন।

নীচে প্রক্রিয়াটির একটি উদাহরণ দেওয়া আছে (আপনি এটি আপনার লক্ষ্যযুক্ত ব্রাউজারগুলিতে পরীক্ষা করতে পারেন):

/**
 * Returns a copy of an object, which is ordered by the keys of the original object.
 *
 * @param {Object} object - The original object.
 * @returns {Object} Copy of the original object sorted by keys.
 */
function getSortedObject(object) {
  // New object which will be returned with sorted keys
  var sortedObject = {};

  // Get array of keys from the old/current object
  var keys = Object.keys(object);
  // Sort keys (in place)
  keys.sort();

  // Use sorted keys to copy values from old object to the new one
  for (var i = 0, size = keys.length; i < size; i++) {
    key = keys[i];
    value = object[key];
    sortedObject[key] = value;
  }

  // Return the new object
  return sortedObject;
}

/**
 * Test run
 */
var unsortedObject = {
  d: 4,
  a: 1,
  b: 2,
  c: 3
};

var sortedObject = getSortedObject(unsortedObject);

for (var key in sortedObject) {
  var text = "Key: " + key + ", Value: " + sortedObject[key];
  var paragraph = document.createElement('p');
  paragraph.textContent = text;
  document.body.appendChild(paragraph);
}

দ্রষ্টব্য: অবজেক্ট.কিজ একটি ECMAScript 5.1 পদ্ধতি তবে পুরানো ব্রাউজারগুলির জন্য এখানে একটি পলফিল রয়েছে:

if (!Object.keys) {
  Object.keys = function (object) {
    var key = [];
    var property = undefined;
    for (property in object) {
      if (Object.prototype.hasOwnProperty.call(object, property)) {
        key.push(property);
      }
    }
    return key;
  };
}

2

আমি কিছু জাভা এনামকে জাভাস্ক্রিপ্ট অবজেক্টে স্থানান্তরিত করেছি।

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

Types:

var TypeA = {
    "-1": "Any",
    "2": "2L",
    "100": "100L",
    "200": "200L",
    "1000": "1000L"
};

var TypeB = {
    "U": "Any",
    "W": "1L",
    "V": "2L",
    "A": "100L",
    "Z": "200L",
    "K": "1000L"
};


Sorted Keys(output):

Key list of TypeA -> ["-1", "2", "100", "200", "1000"]

Key list of TypeB -> ["U", "W", "V", "A", "Z", "K"]

2

লোডাস ব্যবহার করে সহজ এবং পঠনযোগ্য স্নিপেট।

সারণি বাইকে কল করার সময় আপনার কীটি উদ্ধৃতিতে রাখা দরকার। এটি ডেটা নিজেই উদ্ধৃতিতে হবে না।

_.sortBy(myObj, "key")

এছাড়াও, মানচিত্রে আপনার দ্বিতীয় প্যারামিটারটি ভুল। এটি একটি ফাংশন হওয়া উচিত, তবে প্লাক ব্যবহার করা আরও সহজ।

_.map( _.sortBy(myObj, "key") , "value");

2

@ সিন্ড্রেসারস দ্বারা একটি দুর্দান্ত প্রকল্প রয়েছে যার নাম সাজানো-কীগুলি দুর্দান্ত কাজ করে।

আপনি এর উত্স কোডটি এখানে পরীক্ষা করতে পারেন:

https://github.com/sindresorhus/sort-keys

অথবা আপনি এটি এনপিএম সহ ব্যবহার করতে পারেন:

$ npm install --save sort-keys

এখানে তার রেডমি থেকে কোড উদাহরণ রয়েছে

const sortKeys = require('sort-keys');

sortKeys({c: 0, a: 0, b: 0});
//=> {a: 0, b: 0, c: 0}

sortKeys({b: {b: 0, a: 0}, a: 0}, {deep: true});
//=> {a: 0, b: {a: 0, b: 0}}

sortKeys({c: 0, a: 0, b: 0}, {
    compare: (a, b) => -a.localeCompare(b)
});
//=> {c: 0, b: 0, a: 0}

1

কোনও অবজেক্টকে সাজানোর জন্য বিশুদ্ধ জাভাস্ক্রিপ্টের উত্তর। আমি জানি যে এটিই কেবলমাত্র উত্তরটি নেতিবাচক সংখ্যাগুলি পরিচালনা করবে। এই ফাংশনটি সংখ্যাগত অবজেক্টগুলিকে বাছাই করার জন্য।

ইনপুট আপত্তি = {1000: {}, -1200:}}, 10000: {}, 200:}}};

function osort(obj) {
var keys = Object.keys(obj);
var len = keys.length;
var rObj = [];
var rK = [];
var t = Object.keys(obj).length;
while(t > rK.length) {
    var l = null;
    for(var x in keys) {
        if(l && parseInt(keys[x]) < parseInt(l)) {
            l = keys[x];
            k = x;
        }
        if(!l) { // Find Lowest
            var l = keys[x];
            var k = x;
        }
    }
    delete keys[k];
    rK.push(l);
}

for (var i = 0; i < len; i++) {

    k = rK[i];
    rObj.push(obj[k]);
}
return rObj;
}

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


1

কেবল এটি সরল করার জন্য এবং ম্যাট বল থেকে উত্তরটি আরও স্পষ্ট করার জন্য

//your object
var myObj = {
    b : 'asdsadfd',
    c : 'masdasaf',
    a : 'dsfdsfsdf'
  };

//fixed code
var keys = [];
for (var k in myObj) {
  if (myObj.hasOwnProperty(k)) {
    keys.push(k);
  }
}
keys.sort();
for (var i = 0; i < keys.length; i++) {
  k = keys[i];
  alert(k + ':' + myObj[k]);
}


1

এটি প্রশ্নের উত্তর দেয় কিনা তা নিশ্চিত নই, তবে এটি আমার প্রয়োজন ছিল।

Maps.iterate.sorted = function (o, callback) {
    var keys = Object.keys(o), sorted = keys.sort(), k; 
    if ( callback ) {
            var i = -1;
            while( ++i < sorted.length ) {
                    callback(k = sorted[i], o[k] );
            }
    }

    return sorted;
}

নামে পরিচিত:

Maps.iterate.sorted({c:1, b:2, a:100}, function(k, v) { ... } ) 

1

এক লাইন:

Object.entries(unordered)
  .sort(([keyA], [keyB]) => keyA > keyB)
  .reduce((obj, [key,value]) => Object.assign(obj, {[key]: value}), {})

1

এটি করার সবচেয়ে ভাল উপায়

 const object =  Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {})

 //else if its in reverse just do 

 const object = Object.keys(0).reverse ()

আপনি প্রথমে আপনার প্রায়-অ্যারে-জাতীয় বস্তুকে সত্যিকারের অ্যারে রূপান্তর করতে পারেন এবং তারপরে .revers () ব্যবহার করতে পারেন:

Object.assign([], {1:'banana', 2:'apple', 
3:'orange'}).reverse();
// [ "orange", "apple", "banana", <1 empty slot> ]

শেষে যদি খালি স্লট হয় কারণ আপনার প্রথম সূচকটি 0 এর পরিবর্তে 1 হয় You আপনি খালি স্লটটি। দৈর্ঘ্য - বা .পপ () দিয়ে সরাতে পারেন।

বিকল্পভাবে, আপনি যদি orrowণ নিতে চান। বিপরীত হয়ে একই জিনিসটিতে কল করতে চান, এটি অবশ্যই একটি সম্পূর্ণ-অ্যারে-জাতীয় বস্তু হতে হবে। এটির জন্য একটি দৈর্ঘ্যের সম্পত্তি প্রয়োজন:

Array.prototype.reverse.call({1:'banana', 2:'apple', 
3:'orange', length:4});
// {0:"orange", 1:"apple", 3:"banana", length:4}

নোট করুন এটি একই রকম পুরো-অ্যারে-জাতীয় বস্তুটি প্রত্যাবর্তন করবে, সুতরাং এটি আসল অ্যারে হবে না। এরপরে দৈর্ঘ্যের সম্পত্তিটি মুছতে আপনি মুছুন ব্যবহার করতে পারেন।

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