javascript जावास्क्रिप्ट ऑब्जेक्ट को सॉर्ट करने के लिए, या इसे सरणी में कैसे परिवर्तित करें?




arrays json (6)

मैंने हाल ही में उस समस्या पर ठोकर खाई है जब वस्तुओं में से किसी एक के गुणों को समूहित करने की कोशिश कर रहा है, जिसके परिणामस्वरूप एक वस्तु मैं सॉर्ट नहीं कर सकता।

कंक्रीटली यह ब्लॉग पोस्ट की एक सरणी है जिसे मैं सालाना समूह करना चाहता हूं और उन्हें अवरोही वर्षों से क्रमबद्ध करना चाहता हूं। मैंने अंडरस्कोर की उपयोगिता का उपयोग किया:

var grouped = _.groupBy(blogposts, function(post){
  var date = new Date(post.publication_date)
  return date.getFullYear()
})
//=> { 2010: [blogpost, blogpost,etc], 2011: [blogpost, etc] }

जैसा कि @ रेनोस ने समझाया है कि इसे सॉर्ट करने से पहले मुझे कुछ प्रकार के सरणी के साथ समाप्त करना पड़ा था ...

यह अंडरस्कोर (1.4) में पता चला है कि pairs नामक एक अच्छी छोटी उपयोगिता है जो आपकी वस्तु के {key: value} को [key, value] की सरणी में मैप करेगी। के बराबर:

var paired = _.map(grouped, function(val, key){
  return [key, val]
})
//=> [ [2010, [blogpost, blogpost, ...] ], [2011, [blogpost, blogpost, ...]]...]

वहां से आप आसानी से प्रत्येक जोड़ी की पहली अवधि से सॉर्ट कर सकते हैं।

अंतिम परिणाम यहां दिया गया है:

var grouped = _.groupBy(result.resource, function(resource){
  var date = new Date(resource.pub_date)
  return date.getFullYear() //+ "." + (date.getMonth()+1)
})

var paired = _.pairs(grouped)

var sorted = _.sortBy(paired, function(pairs){
  return -parseInt(pairs[0])
})

return sorted;
// Giving me the expected result:
//=> [ [2013, [blogpost, blogpost, ...] ], [2012, [blogpost, blogpost, ...]]...]

मुझे यकीन है कि हालांकि एक बेहतर और अधिक प्रदर्शन करने वाला तरीका है, लेकिन रूबी से आ रहा है यह कोड मेरे लिए तुरंत समझ में आता है।

मेरे पास कुछ JSON डेटा है जो मुझे सर्वर से मिलता है। मेरी जावास्क्रिप्ट में, मैं इस पर कुछ सॉर्ट करना चाहता हूं। मुझे लगता है कि सॉर्ट () फ़ंक्शन वह करेगा जो मैं चाहता हूं।

हालांकि, ऐसा लगता है कि जावास्क्रिप्ट जेएसओएन डेटा को आगमन पर तुरंत ऑब्जेक्ट में परिवर्तित कर रहा है। अगर मैं सॉर्ट () विधि का उपयोग करने का प्रयास करता हूं, तो मुझे त्रुटियां मिलती हैं (परीक्षण के लिए फायरबग का उपयोग करके)।

मैंने नेट के चारों ओर देखा है, और हर कोई कहता है कि एक चीज़ के लिए, JSON ऑब्जेक्ट्स पहले ही जावास्क्रिप्ट सरणी हैं, और यह भी कि ऑब्जेक्ट्स को सरणी की तरह ही इलाज किया जा सकता है। इस सवाल पर , जहां उत्तर में से एक में, एक लड़का कहता है "द ऑब्जेक्ट ऑब्जेक्ट] आपका डेटा है - आप इसे एक्सेस कर सकते हैं जैसे आप एक सरणी करेंगे।"

हालांकि, यह बिल्कुल सही नहीं है। जावास्क्रिप्ट मुझे मेरे ऑब्जेक्ट पर सॉर्ट () का उपयोग करने नहीं देगा। और चूंकि डिफ़ॉल्ट धारणा यह है कि वे सभी एक ही चीज हैं, ऑब्जेक्ट को किसी ऐरे में कनवर्ट करने के तरीके पर कहीं भी कोई निर्देश नहीं प्रतीत होता है, या जावास्क्रिप्ट को इसे एक के रूप में या इसके जैसा कुछ भी करने के लिए मजबूर करता है।

तो ... मैं जावास्क्रिप्ट को इस डेटा को सरणी के रूप में कैसे पेश करने और क्रमबद्ध करने के लिए कैसे प्राप्त करूं?

मेरे ऑब्जेक्ट का कंसोल लॉग आउटपुट इस तरह दिखता है (मैं "स्तर" में मानों को सॉर्ट करने में सक्षम होना चाहता हूं):

ऑब्जेक्ट JSONdata

{ 
1: {
    displayName: "Dude1",
    email: "[email protected]<mailto:[email protected]>",
    lastActive: 1296980700, 
    level: 57, 
    timeout: 12969932837
}, 2: {
    displayName: "Dude2",
    email: "[email protected]<mailto:[email protected]>",
    lastActive: 1296983456,
    level: 28,
    timeout: 12969937382
}, 3: {
    displayName: "Dude3",
    email: "[email protected]<mailto:[email protected]>",
    lastActive: 1296980749,
    level: 99,
    timeout: 129699323459
} 
}

आप एक जावास्क्रिप्ट ऑब्जेक्ट को एक सरणी में कनवर्ट करने में सक्षम होना चाहिए ...

var obj = {
    '1': 'a',
    '2': 'b',
    '3': 'c'  
};

var arr = [];

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      arr.push(obj[key]);  
    }
}

console.log(arr); // ["a", "b", "c"]

इसे जेएसफ़ील्ड पर देखें


यदि आपकी जावास्क्रिप्ट ऑब्जेक्ट एक सरणी जैसी वस्तु है , यानी, एक वैध संख्यात्मक length संपत्ति वाला ऑब्जेक्ट उदाहरण है, तो आप call विधि के लिए धन्यवाद पर कई देशी ऐरे विधियों का सीधे उपयोग कर सकते हैं। उदाहरण के लिए:

// Sorts the given objet in-place as if it was an array
Array.prototype.sort.call(yourObject);

तो यदि आप सॉर्ट करने के लिए प्रविष्टियों की संख्या जानते हैं ( जावास्क्रिप्ट में किसी ऑब्जेक्ट की कुंजी / गुणों की संख्या को कुशलतापूर्वक कैसे गिनें? ), तो आप यह कर सकते हैं:

yourObject.length = theNumberOfEntries;
Array.prototype.sort.call(yourObject);
// Optionally: delete yourObject.length;

ध्यान दें कि यह केवल "0", "1", "2", ... length - 1 समावेशी, जैसे एक ऐरे में अनुक्रमित गुणों को क्रमबद्ध करेगा। ऑब्जेक्ट की अन्य गुणों का पुन: आदेश नहीं दिया जाएगा।


jQuery एक नक्शा फ़ंक्शन प्रदान करता है, जो किसी तत्व या ऑब्जेक्ट में प्रत्येक तत्व के माध्यम से पुनरावृत्त करेगा और परिणामों को एक नई सरणी में मैप करेगा।

JQuery 1.6 से पहले, $ .map () समर्थित ट्रैवर्सिंग सरणी केवल।

हम किसी भी ऑब्जेक्ट को सरणी में बदलने के लिए इसका उपयोग कर सकते हैं ...

  myArray = $.map(myObject, function (el) {
    return el;
  });

लेकिन ... यदि कॉलबैक फ़ंक्शन शून्य या अपरिभाषित हो जाता है , तो उस मान को सरणी से हटा दिया जाता है , ज्यादातर मामलों में यह उपयोगी होता है, लेकिन अगर आपको myArray में शून्य मानों की आवश्यकता होती है तो यह समस्याएं पैदा कर सकती है।

jQuery इसके लिए एक समाधान प्रदान करता है ... मान को एकल मान के साथ सरणी के रूप में वापस कर देता है

myArrayWithNulls = jQuery.map(myObject, function (el) {
  return [el];
});

यहां दो दृष्टिकोणों का प्रदर्शन करने वाला एक पहेली है: http://jsfiddle.net/chim/nFyPE/

http://jsperf.com/object-to-array-jquery-2


Array.prototype.slice.call(arrayLikeObject)

कनवर्ट करने का मानक तरीका है और एक सरणी जैसी वस्तु को सरणी में है।

यह केवल arguments वस्तु के लिए वास्तव में काम करता है। एक जेनेरिक ऑब्जेक्ट को सरणी में कनवर्ट करने के लिए दर्द का थोड़ा सा हिस्सा होता है। underscore.js से स्रोत यहां दिया गया है:

_.toArray = function(iterable) {
    if (!iterable)                return [];
    if (iterable.toArray)         return iterable.toArray();
    if (_.isArray(iterable))      return iterable;
    if (_.isArguments(iterable))  return slice.call(iterable);
    return _.values(iterable);
};

_.values = function(obj) {
    return _.map(obj, _.identity);
};

बाहर निकलता है आपको अपनी ऑब्जेक्ट पर लूप करने की आवश्यकता होगी और इसे अपने आप सरणी में मैप करें।

var newArray = []
for (var key in object) {
    newArray.push(key);
}

आप सरणी और "सहयोगी सरणी" की अवधारणाओं को भ्रमित कर रहे हैं। जावास्क्रिप्ट में, वस्तुएं एक सहयोगी सरणी की तरह कार्य करती हैं क्योंकि आप प्रारूप object["key"] में डेटा तक पहुंच सकते हैं। वे वास्तविक सहयोगी सरणी नहीं हैं क्योंकि ऑब्जेक्ट्स अनॉर्डर्ड सूचियां हैं।

वस्तुओं और सरणी काफी अलग हैं।

अंडरस्कोर का उपयोग करने का एक उदाहरण:

var sortedObject = _.sortBy(object, function(val, key, object) {
    // return an number to index it by. then it is sorted from smallest to largest number
    return val;
});

लाइव उदाहरण देखें


इनमें से अधिकतर उत्तर इस मुद्दे को जटिल बनाते हैं या JQuery या Underscore का उपयोग करते हैं जबकि ओपी ने उनसे कभी नहीं पूछा।

आप किसी ऑब्जेक्ट को इस तरह के सरणी में परिवर्तित कर सकते हैं:

myArray= Object.keys(data).map(function(key) { return data[key] });

और परिणाम इस प्रकार सॉर्ट करें:

myArray.sort(function(x, y) {return x.level - y.level});

यदि आपको आईडी / इंडेक्स की आवश्यकता है, तो आपको थोड़ा और करने की आवश्यकता है:

Object.keys(data).map(function(key) { 
  var obj = data[key];
  obj.index = key;
  return obj 
});




object