कुंजी द्वारा जावास्क्रिप्ट ऑब्जेक्ट को क्रमबद्ध करें


532

मुझे कुंजी द्वारा जावास्क्रिप्ट ऑब्जेक्ट को सॉर्ट करने की आवश्यकता है।

इसलिए निम्नलिखित हैं:

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

बन जाएगा:

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


38
2011 में वापस (जब यह प्रश्न पोस्ट किया गया था), ECMAScript कल्पना ने कहा कि जावास्क्रिप्ट ऑब्जेक्ट्स में एक अंतर्निहित आदेश नहीं है - मनाया गया आदेश कार्यान्वयन-निर्भर था और इस तरह उस पर भरोसा नहीं किया जा सकता था। हालाँकि, यह सभी जावास्क्रिप्ट इंजनों को कमोबेश एक ही शब्दार्थ को लागू करता है , इसलिए अब इन्हें ES6 में मानकीकृत किया गया है । नतीजतन, नीचे दिए गए बहुत सारे उत्तर कल्पना के अनुसार सही होते थे, लेकिन अब गलत हैं।
मथियास बीनेंस

जब आप परिणामों की तुलना या हैश करने की आवश्यकता हो, तो शीघ्र ही सॉर्ट किए गए स्ट्रिंग का
एक्सबुक

यह देखते हुए कि वस्तुएं सिर्फ नक्शे हैं, या आपकी भाषा पर निर्भर करती हैं, इस बात का कोई कारण नहीं है कि आप ऐसा क्यों करेंगे। वे कहते हैं, आम तौर पर, वे एक नक्शे में इंजेक्ट किया जाता है कि वास्तव में आदेश है जब वे सख्त जब वे रहते हैं। एसओ, यदि आपने एक नया नक्शा बनाया है और एक निर्धारित कुंजी सूची के आधार पर मान दिए हैं, तो आप अपने आप को कुंजियों के आधार पर एक ऑर्डर किया हुआ नक्शा
पाएंगे

ध्यान दें कि जब से Object.entriesऔर Object.fromEntriesजेएस में जोड़ा गया था, यह एक अच्छी तरह से एक-लाइनर के साथ प्राप्त किया जा सकता है:Object.fromEntries(Object.entries(obj).sort())
माइक 'पोमैक्स' कामेरमेंस

जवाबों:


471

इस प्रश्न के अन्य उत्तर पुराने हैं, कभी भी कार्यान्वयन वास्तविकता से मेल नहीं खाते, और अब आधिकारिक रूप से गलत हो गए हैं कि ES6 / ES2015 कल्पना प्रकाशित हुई है।


एक्सल रस्शमेयर द्वारा ES6 की खोज में संपत्ति पुनरावृत्ति क्रम पर अनुभाग देखें :

संपत्ति कुंजियों पर पुनरावृति करने वाली सभी विधियाँ उसी क्रम में होती हैं:

  1. पहले सभी ऐरे सूचकांक, संख्यात्मक रूप से छांटे गए।
  2. फिर सभी स्ट्रिंग कुंजियाँ (जो सूचक नहीं हैं), जिस क्रम में वे बनाई गई थीं।
  3. फिर सभी प्रतीकों, जिस क्रम में वे बनाए गए थे।

तो हाँ, JavaScript ऑब्जेक्ट हैं तथ्य का आदेश दिया है, और उनके चाबियों का आदेश / गुण बदला जा सकता है में।

यहां बताया गया है कि आप किसी वस्तु को उसकी कुंजियों / गुणों के आधार पर, वर्णानुक्रम में कैसे क्रमबद्ध कर सकते हैं:

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
FYI करें, यह स्पष्ट किया गया था कि संपत्तियों का गणना क्रम अभी भी अपरिभाषित है: esdiscuss.org/topic/…
फेलिक्स क्लिंग

6
@ Phil_1984_ यह उत्तर और शीर्ष मतदान उत्तर बहुत अलग हैं। ओपी का सवाल था कि वस्तु शाब्दिक को कैसे छांटा जाए। शीर्ष मतदान जवाब कहता है कि आप नहीं कर सकते हैं, फिर किसी सरणी में सॉर्ट की गई चाबियों को संग्रहीत करके एक वर्कअराउंड देता है, फिर सॉर्ट किए गए सरणी से कुंजी मूल्य जोड़े को पुनरावृत्त और मुद्रित करता है। यह उत्तर दावा करता है कि वस्तु शाब्दिकों का क्रम अब क्रमबद्ध है और उसका उदाहरण किसी वस्तु शाब्दिक रूप से छांटे गए प्रमुख मानों को संग्रहीत करता है, फिर छांटे गए ऑब्जेक्ट को सीधे प्रिंट करता है। एक साइड नोट पर, यह अच्छा होगा यदि लिंक की गई साइट अभी भी मौजूद है।
cchamberlain

6
दोनों उत्तर बस कुंजियों को क्रमबद्ध करने के लिए Array.sort फ़ंक्शन का उपयोग करते हैं। ओपी एक "जावास्क्रिप्ट ऑब्जेक्ट" सॉर्ट करने के लिए कह रहा है और केवल 2 ऑब्जेक्ट्स का वर्णन करने के लिए जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) का उपयोग कर रहा है। ये 2 वस्तुएं तार्किक रूप से समान हैं जिसका अर्थ है कि छांटना अप्रासंगिक है। मुझे लगता है कि शीर्ष उत्तर इसे बहुत बेहतर बताते हैं। यह कहना कि "अन्य सभी उत्तर अब आधिकारिक रूप से गलत हैं" मेरे लिए बहुत चरम है, खासकर एक टूटी हुई कड़ी के साथ। मुझे लगता है कि समस्या यह है "यह नया ES6 युक्ति" यह भ्रम दे रहा है कि जावास्क्रिप्ट ऑब्जेक्ट्स में कुंजियों की एक आदेशित सूची है जो बस सच है।
फिल

1
कृपया यह जोड़ें कि यह समाधान विभिन्न प्रकार के आधुनिक ब्राउज़रों (google "caniuse ES6") द्वारा समर्थित नहीं है। इस उत्तर का उपयोग कुछ ब्राउज़रों में हार्ड-टू-फाइंड बग्स को जोखिम में डाल देता है (जैसे कि क्रोम जब सब ठीक है)।
मैनुअल आर्म्ड श्मिट

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 पांडित्य नहीं है, लेकिन JSON ऑब्जेक्ट जैसी कोई चीज नहीं है


2
@MarcelKorpel एक JSON ऑब्जेक्ट जैसी कोई चीज़ है। आधिकारिक JSON RFC के अनुभाग 8 की जाँच करें: ietf.org/rfc/rfc4627.txt
पॉल

8
@Papropro उस आरएफसी के बारे में दो बातें ध्यान दें: पहला, यह इस बिंदु पर 7 साल पुराना है, और समय के साथ शब्दावली में परिवर्तन होता है; दूसरा, "यह ज्ञापन इंटरनेट समुदाय के लिए जानकारी प्रदान करता है। यह किसी भी प्रकार के इंटरनेट मानक को निर्दिष्ट नहीं करता है।" क्या वर्णों का दिया गया क्रम जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक है या JSON टेक्स्ट संदर्भ / उपयोग पर निर्भर करता है। "JSON ऑब्जेक्ट" शब्द का सामना करता है और एक हानिकारक तरीके से भेद को अस्पष्ट बनाता है। आइए अव्यवस्थित शब्दावली से छुटकारा पाएं, और जहां संभव हो, वहां अधिक सटीक शब्द का उपयोग करें। मुझे अन्यथा करने का कोई कारण नहीं दिखता। शब्द मायने रखते हैं।
मैट बॉल

6
@MattBall IMO JSON ऑब्जेक्ट स्ट्रिंग के लिए बहुत सटीक शब्द है जैसे {"a", 1}कि JSON Array एक स्ट्रिंग के लिए सटीक शब्द है [1]। स्ट्रिंग होने पर मेरी सरणी में तीसरी वस्तु जैसी चीजों को कहकर संवाद करने में सक्षम होना उपयोगी है [{x: 1}, {y: 2}, {z: 3}], इसलिए मैं बहुत पसंद करता हूं "एक जावास्क्रिप्ट वस्तु नहीं है" जब एक जावास्क्रिप्ट शाब्दिक के बारे में टिप्पणी करता है, बल्कि तब "ऐसा कोई नहीं है एक JSON ऑब्जेक्ट के रूप में ", जो अभी बाद में अधिक भ्रम और संचार कठिनाइयों का कारण बनने जा रहा है जब ओपी वास्तव में JSON के साथ काम कर रहा है।
पॉल

3
@Paulpro मुझे असहमत होना चाहिए। {"a", 1}या तो एक वस्तु शाब्दिक है या एक JSON टेक्स्ट (उर्फ JSON स्ट्रिंग, यदि आप वास्तव में पसंद करते हैं)। यह संदर्भ पर निर्भर करता है, पूर्व यदि यह जावास्क्रिप्ट स्रोत कोड के भीतर शब्दशः दिखाई देता है, तो बाद में अगर यह एक स्ट्रिंग है जिसे आगे जाने के लिए JSON पार्सर को पारित करने की आवश्यकता है। जब यह वाक्यविन्यास, सही उपयोग और क्रमांकन की अनुमति देता है, तो दोनों के बीच वास्तविक अंतर हैं।
मैट बॉल

4
अब जब ES6 / ES2015 को अंतिम रूप दिया गया है, तो यह उत्तर आधिकारिक रूप से गलत हो गया है। अधिक जानकारी के लिए मेरा जवाब देखें।
मथियास बीनेंस

172

बहुत से लोगों ने उल्लेख किया है कि "वस्तुओं को छांटा नहीं जा सकता है" , लेकिन इसके बाद वे आपको एक समाधान दे रहे हैं जो काम करता है। विरोधाभास, है ना?

कोई भी उल्लेख नहीं करता है कि वे समाधान क्यों काम कर रहे हैं। वे हैं, क्योंकि ब्राउज़र के अधिकांश कार्यान्वयन वस्तुओं में मूल्यों को उस क्रम में संग्रहीत किया जाता है जिसमें उन्हें जोड़ा गया था। इसीलिए यदि आप कुंजी की छँटाई सूची से नई वस्तु बनाते हैं तो यह अपेक्षित परिणाम देता है।

और मुझे लगता है कि हम एक और समाधान जोड़ सकते हैं - 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
यह EcmaScript v5 में कार्य को पूरा करने का सबसे सरल और सबसे संक्षिप्त तरीका है। पार्टी के लिए थोड़ा देर से लेकिन स्वीकार किए जाते हैं जवाब होना चाहिए।
स्टीवन डी सलास

2
"वे हैं, क्योंकि ब्राउज़र के अधिकांश कार्यान्वयन वस्तुओं में मूल्यों को उस क्रम में संग्रहीत किया जाता है जिसमें उन्हें जोड़ा गया था" केवल गैर-संख्यात्मक गुणों के लिए हालांकि। यह भी ध्यान दें कि अभी भी कोई गारंटी नहीं है कि किस क्रम में संपत्तियां (जैसे के माध्यम से for...in) पुनरावृत्त होती हैं ।
फेलिक्स क्लिंग

2
आपको यह समझाने में अच्छा लगा कि यह क्यों काम कर रहा है, मेरे लिए यह सबक है। धन्यवाद!
ola

5
मेरे लिंटर ने उस वन-लाइनर (असाइनमेंट लौटाने) के बारे में शिकायत की, लेकिन यह एक मेरे लिए काम करता है और मेरे लिए पढ़ना आसान है:Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
अक्स।

68

दोस्तों मैं बहुत हैरान हूँ! यकीन है कि सभी उत्तर कुछ पुराने हैं, लेकिन किसी ने भी छँटाई में स्थिरता का उल्लेख नहीं किया! इसलिए मेरे साथ रहिए मैं स्वयं इस प्रश्न का उत्तर देने की पूरी कोशिश करूंगा और यहां विवरण में जाऊंगा। इसलिए मैं अब माफी मांगने जा रहा हूं, यह पढ़ने के लिए बहुत कुछ होगा।

चूंकि यह 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 () एक सरणी देता है, जिसके तत्व सीधे ऑब्जेक्ट पर पाए जाने वाले असंख्य गुणों के अनुरूप होते हैं। गुणों का क्रम वही होता है जो वस्तु के गुणों पर मैन्युअल रूप से लूपिंग द्वारा दिया जाता है।

सिडेनोट - आप 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' ]

यहाँ डॉक्स से एक उद्धरण है:

सॉर्ट () विधि एक सरणी के तत्वों को जगह में सॉर्ट करती है और सरणी को वापस करती है। सॉर्ट आवश्यक रूप से स्थिर नहीं है। डिफ़ॉल्ट सॉर्ट क्रम स्ट्रिंग यूनिकोड कोड बिंदुओं के अनुसार है।

इस तरह के समय और स्थान की जटिलता की गारंटी नहीं दी जा सकती क्योंकि यह कार्यान्वयन पर निर्भर है।

आपको यह सुनिश्चित करना होगा कि उनमें से एक आपके लिए वांछित आउटपुट लौटाए। यदि आप एक साथ एपीआई और डेटाबेस जैसे विभिन्न सूचना इनपुट का उपयोग करते हैं, तो वास्तविक जीवन के उदाहरणों में लोग चीजों को पूरी तरह से मिलाते हैं।


तो कौन सी बड़ी बात है?

वैसे दो लेख हैं जिन्हें हर प्रोग्रामर को समझना चाहिए:

इन-प्लेस एल्गोरिथम :

कंप्यूटर विज्ञान में, एक इन-प्लेस एल्गोरिथ्म एक एल्गोरिथ्म है जो बिना किसी सहायक डेटा संरचना का उपयोग किए इनपुट को बदल देता है। हालांकि सहायक चर के लिए अतिरिक्त भंडारण स्थान की एक छोटी राशि की अनुमति है। एल्गोरिथ्म के निष्पादित होते ही इनपुट आमतौर पर आउटपुट द्वारा अधिलेखित हो जाता है। इन-प्लेस एल्गोरिथ्म केवल तत्वों के प्रतिस्थापन या अदला-बदली के माध्यम से इनपुट अनुक्रम को अपडेट करता है। एक एल्गोरिथ्म जो कभी-कभी अंदर नहीं होता है उसे कभी-कभी अंदर या बाहर का स्थान नहीं कहा जाता है।

तो मूल रूप से हमारे पुराने सरणी को अधिलेखित कर दिया जाएगा! यह महत्वपूर्ण है यदि आप अन्य कारणों से पुराने सरणी को रखना चाहते हैं। इसलिए इस बात का ध्यान रखें।

छँटाई एल्गोरिथ्म

स्थिर क्रम एल्गोरिदम समान तत्वों को उसी क्रम में क्रमबद्ध करते हैं जो वे इनपुट में दिखाई देते हैं। कुछ प्रकार के डेटा को सॉर्ट करते समय, सॉर्ट क्रम का निर्धारण करते समय डेटा के केवल भाग की जांच की जाती है। उदाहरण के लिए, कार्ड के दाईं ओर के सॉर्टिंग उदाहरण में, कार्ड को उनकी रैंक के आधार पर सॉर्ट किया जा रहा है, और उनके सूट को नजरअंदाज किया जा रहा है। यह मूल सूची के कई अलग-अलग सही ढंग से सॉर्ट किए गए संस्करणों की संभावना को अनुमति देता है। स्थिर सॉर्टिंग एल्गोरिदम इनमें से एक का चयन करता है, निम्न नियम के अनुसार: यदि दो आइटम समान तुलना करते हैं, जैसे दो 5 कार्ड, तो उनके सापेक्ष क्रम को संरक्षित किया जाएगा, ताकि यदि कोई इनपुट में दूसरे से पहले आए, तो यह भी होगा आउटपुट में दूसरे से पहले आते हैं।

यहाँ छवि विवरण दर्ज करें

ताश खेलने पर स्थिर प्रकार का उदाहरण। जब कार्डों को एक स्थिर क्रम के साथ रैंक द्वारा सॉर्ट किया जाता है, तो दो 5s को क्रमबद्ध आउटपुट में उसी क्रम में रहना चाहिए, जिसमें वे मूल रूप से थे। जब वे एक गैर-स्थिर सॉर्ट के साथ सॉर्ट किए जाते हैं, तो 5 एस विपरीत में समाप्त हो सकते हैं। क्रमबद्ध आउटपुट में आदेश।

इससे पता चलता है कि छंटाई सही है लेकिन यह बदल गया। तो असली दुनिया में भी अगर छँटाई सही है तो हमें यह सुनिश्चित करना होगा कि हमें वही मिले जिसकी हमें उम्मीद है! यह सुपर महत्वपूर्ण है इसे भी ध्यान में रखें। अधिक जावास्क्रिप्ट उदाहरणों के लिए Array.prototype.sort () - डॉक्स: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects-Array/sort देखें


3
आप चट्टान को चीरते हैं, इस अविश्वसनीय जवाब के लिए धन्यवाद। सबसे अच्छा मैं SO पर देखा है। चीयर्स।
गैविन

यदि केवल आप अंत में उपयोग करने के लिए एक आकर्षक विधि प्रदान कर सकते हैं। हालांकि महान जवाब!
mmm

@ ममोमो समस्या यह है कि आप छँटाई से क्या उम्मीद करते हैं, इस पर निर्भर करता है कि कोई सही तरीका नहीं है। हालांकि आप बस मेरा उत्तर से कोड के इस टुकड़े का उपयोग कर सकते हैं: Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
मेगाजिन

इस प्रश्न पर लागू नहीं होने वाली सॉर्ट की स्थिरता नहीं है: हम ऑब्जेक्ट कुंजी द्वारा सॉर्ट कर रहे हैं, और कुंजी अद्वितीय है। (अपने कार्ड के उदाहरण का विस्तार करने के लिए: पैक में दो 5s कभी नहीं हो सकते, भले ही वे अलग-अलग सूट के हों।)
डैरेन कुक

@DarrenCook अच्छा सवाल! आप सही हैं एक वस्तु में कभी भी एक ही कुंजी नहीं होगी। हालांकि स्थिरता केवल एक कुंजी की विशिष्टता से अधिक जटिल है। अधिकांश समय एक सरणी वस्तुओं को छांटने में शामिल होती है। और वह तब है जब सब कुछ अस्थिर हो सकता है। 5 खिलाड़ियों के साथ एक कार्ड गेम की कल्पना करें। प्रत्येक हाथ एक सरणी (एक व्यक्तिगत हाथ छँटाई रखने के लिए) और वस्तुओं के रूप में कार्ड द्वारा दर्शाया जाता है। यदि आपका कार्ड ऐसा दिखता है {5: 'hearts'}या {5: 'spades'}आप सरणी को छांटना शुरू कर देते हैं तो यह रम्मी जैसे गेम में संभावित रूप से अस्थिर हो जाएगा। अलग-अलग भाषाओं की बात नहीं।
मेगाजिन

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
@ श्रद्धालु नहीं यह उत्तर सही नहीं है। यह एक नई वस्तु लौटाता है, जिसका कोई क्रम नहीं है।
पॉल

3
@ श्रद्धालु यह व्यवहार में भी नहीं आता है। ऑब्जेक्ट कुंजियों पर ऑर्डर जैसी कोई चीज नहीं है, इसलिए आप यह कैसे कह सकते हैं कि व्यवहार में यह आपको क्रमबद्ध क्रम में एक वस्तु देता है? यह वास्तव में आपको केवल उस वस्तु की एक उथली प्रति वापस देता है जिसे आप पास करते हैं।
पॉल

9
यह सुपर गलत है। यह अब के लिए काम करने के लिए हो सकता है, लेकिन एक अलग वेब ब्राउज़र या एक ही ब्राउज़र में अलग पेज लोड में टूट जाएगा। ब्राउज़र सुरक्षा के लिए ऑब्जेक्ट कुंजियों को यादृच्छिक कर सकते हैं, या जैसे ही आप कोई ऑब्जेक्ट भरते हैं, यह कुंजियों के आधार पर मूल्यों को अलग-अलग मेमोरी बकेट में डाल देगा, जो एक अलग ऑर्डर लौटाएगा। यदि ऐसा होता है तो यह आपके लिए भाग्यशाली है।
योबर्ट

11
इसमें jQuery का एक अनावश्यक उपयोग भी है।
RobG

25

यह 2019 है और हमारे पास इसे हल करने का 2019 तरीका है :)

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

2
हम कुंजी द्वारा नेस्टेड ऑब्जेक्ट्स को कैसे सॉर्ट करते हैं?
a2441918

@ a2441918 उसी तरह जैसे आप सॉर्ट () फ़ंक्शन के साथ करते हैं। एक नज़र रखें: developer.mozilla.org/de/docs/Web/JavaScript/Reference/… Object.fromEntries (Object.entries ({b: 3, a: 8, c: 1})। Sort (k, j) ) => k - j))
user2912903

टाइपस्क्रिप्ट उपयोगकर्ताओं के लिए यह हमारे लिए अभी तक उपलब्ध नहीं है, देखें: github.com/microsoft/TypeScript/issues/30933
tsujp

अच्छा वन-लाइनर, लेकिन केस-असंवेदनशील तरीके से कुंजियों को कैसे छाँटा जाए?
TheMaxx

1
@theMaxx सॉर्ट के लिए एक कस्टम फ़ंक्शन का उपयोग करें, जैसे कुछ: `` Object.fromEntries (Object.entries ({b: 3, a: 8, c: 1})। सॉर्ट ([key1, val1], [key2,)। val2]) => key1.toLowerCase ()। localeCompare (key2.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)। यह क्यों भी काम करता है, मुझे इसके बारे में डॉक्स कहां मिल सकते हैं? यह स्पष्ट रूप से सबसे सही पैरामीटर देता है, लेकिन क्यों?
nasaso


लघु कार्य पहले और फिर o[k]बराबर होता हैvo
तहसीन तुर्कोज़

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

मान लें कि यह VisualStudio डिबगर में उपयोगी हो सकता है जो कि अव्यवस्थित ऑब्जेक्ट गुण दिखाता है।

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

तो ग्रेट थैंक्स ए लूओट
मुगिवारा

अच्छा! इस सकुशल समाधान के लिए धन्यवाद।
कोन एंटोनकोस

9

अंडरस्कोर संस्करण :

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

यदि आप कुंजियों के क्रम को बनाए रखने के लिए अपने ब्राउज़र पर भरोसा नहीं करते हैं, तो मैं दृढ़ता से कुंजी-मूल्य युग्मित सरणियों के आदेश दिए गए सरणी पर भरोसा करने का सुझाव देता हूं।

_.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,
});

हो सकता है कि आपके कोड का कुछ स्पष्टीकरण जोड़ना बेहतर हो।
अरस्तू 16

1
वस्तु की कुंजियाँ मिलती हैं, इसलिए यह स्ट्रिंग्स की सरणी है, मैं उन्हें सॉर्ट करता हूं () और जैसा कि यह स्ट्रिंग्स (कुंजियों) का सरणी है मैं उन्हें कम करता हूं (जेएस एरे के साथ (कम))। आरोप शुरू में एक खाली वस्तु {} (reducer का अंतिम अर्ग) है और रिड्यूसर (कॉलबैक) खाली वस्तु पर नियत कुंजी अनुक्रम के साथ स्रोत के मानों को निर्दिष्ट करता है।
user3286817

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।
mmm

केवल एक चीज जो आप यहां कर रहे हैं, वह यह सुनिश्चित करना है कि यह एक सेट है, गैर-इष्टतम तरीके से।
mmm

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; }
isgoed

4

जैसा कि पहले ही उल्लेख किया गया है, वस्तुएं अनियंत्रित हैं।

तथापि...

आपको यह मुहावरा उपयोगी लग सकता है:

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

var kv = [];

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

kv.sort()

तब आप kv के माध्यम से पुनरावृति कर सकते हैं और जो चाहें कर सकते हैं।

> 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]];वहाँ का उद्देश्य क्या है ? क्या हम सिर्फ असाइन नहीं कर सकते?
बॉयांग

ऐसा लगता है कि गैर-मौजूद कुंजी के लिए केवल नए असाइनमेंट कुंजी को अंत में जोड़ देंगे। यदि हटाए जाने पर टिप्पणी की जाती है, तो चाबियाँ न छांटें, कम से कम क्रोम में नहीं।
ब्रुनेटैटन

यह समझ आता है। धन्यवाद! किसी भी मामले में, यह एक खोए हुए कारण की तरह है क्योंकि जेएस ऑब्जेक्ट कुंजियों में कोई अनुक्रम नहीं है, चश्मा के अनुसार। हम सिर्फ ओबज और लॉग फंक्शन का विवरण दे रहे हैं
बोयांग

हाँ, मैं मानचित्र का उपयोग तब करता हूं जब कुंजियों का क्रम महत्वपूर्ण होता है: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
brunettdan


3

यह JSON सॉर्टिंग के लिए मेरी ज़रूरत की हर चीज़ का एक हल है।

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 टैग है। यह अच्छा होगा यदि आप शुद्ध जावास्क्रिप्ट में एक समाधान जोड़ते हैं।
रसमा

धन्यवाद @Phani यह वही है जिसकी मुझे जरूरत थी
विल शेपर्ड

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});

स्पष्टीकरण:

कई जावास्क्रिप्ट रनटाइम्स किसी ऑब्जेक्ट के अंदर मानों को उस क्रम में संग्रहीत करते हैं जिसमें उन्हें जोड़ा जाता है।

किसी ऑब्जेक्ट के गुणों को उनकी कुंजियों के आधार पर सॉर्ट करने के लिए आप Object.keys फ़ंक्शन का उपयोग कर सकते हैं जो कुंजियों की एक सरणी लौटाएगा। कुंजियों के सरणी को फिर Array.prototyp.sort () द्वारा सॉर्ट किया जा सकता है विधि जो किसी सरणी के तत्वों को उन्हें किसी नए चर पर असाइन करने की आवश्यकता नहीं है)।

एक बार चाबियाँ छांटने के बाद आप एक नई वस्तु (जो अब क्रमबद्ध हो जाती है) को भरने के लिए पुरानी वस्तु की सामग्री तक पहुंचने के लिए एक-एक करके उनका उपयोग करना शुरू कर सकते हैं।

नीचे प्रक्रिया का एक उदाहरण है (आप इसे अपने लक्षित ब्राउज़रों में परीक्षण कर सकते हैं):

/**
 * 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);
}

नोट: Object.keys एक 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

@Sindresorhus द्वारा एक बेहतरीन परियोजना है जिसे सॉर्ट-कीज़ कहा जाता है जो कमाल का काम करता है।

आप इसका सोर्स कोड यहाँ देख सकते हैं:

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

या आप इसे npm के साथ उपयोग कर सकते हैं:

$ npm install --save sort-keys

यहाँ उसके readme से कोड उदाहरण भी हैं

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

शुद्ध जावास्क्रिप्ट एक वस्तु को क्रमबद्ध करने का उत्तर देता है। यह एकमात्र उत्तर है कि मुझे पता है कि नकारात्मक संख्या को संभाल लेंगे। यह फ़ंक्शन संख्यात्मक ऑब्जेक्ट्स को सॉर्ट करने के लिए है।

इनपुट obj = {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 ()

आप पहले अपनी लगभग-सरणी जैसी वस्तु को वास्तविक सरणी में बदल सकते हैं, और फिर .reverse () का उपयोग कर सकते हैं:

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

अंत में खाली स्लॉट यदि कारण है क्योंकि आपका पहला सूचकांक 0. के बजाय 1 है। आप खाली स्लॉट को .length-- या .pop () के साथ हटा सकते हैं।

वैकल्पिक रूप से, यदि आप .reverse को उधार लेना चाहते हैं और इसे उसी ऑब्जेक्ट पर कॉल करना चाहते हैं, तो यह पूरी तरह से सरणी जैसी ऑब्जेक्ट होना चाहिए। यही है, यह एक लंबी संपत्ति की जरूरत है:

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

ध्यान दें कि यह पूरी तरह से सरणी-जैसी ऑब्जेक्ट ऑब्जेक्ट लौटाएगा, इसलिए यह एक वास्तविक सरणी नहीं होगा। फिर आप लंबाई की संपत्ति को हटाने के लिए डिलीट का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.