2013-09-24 3 views
30

तो मैं इस तरह एक जावास्क्रिप्ट वस्तु हैक्या मैं जावास्क्रिप्ट ऑब्जेक्ट के माध्यम से रिवर्स ऑर्डर में लूप कर सकता हूं?</p> <pre><code>foo = { "one": "some", "two": "thing", "three": "else" }; </code></pre> <p>मैं पाश कर सकते हैं इस तरह::

for (var i in foo) { 
    if (foo.hasOwnProperty(i)) { 
    // do something 
    } 
} 

कौन सा होगा one>two>three के क्रम में गुण के माध्यम से लूप।

हालांकि कभी-कभी मुझे रिवर्स ऑर्डर में जाना पड़ता है, इसलिए मैं वही लूप करना चाहता हूं, लेकिन three>two>one

प्रश्न:
वहाँ एक "वस्तु-रिवर्स" समारोह है। अगर यह एक ऐरे था, तो मैं unshift के साथ एक नई सरणी को रिवर्स या बिल्ड कर सकता था, लेकिन जब मैं किसी ऑब्जेक्ट के साथ क्या करना चाहता हूं, तो मुझे खो जाता है, जब मुझे इसकी गुणों को रिवर्स-लूप करना पड़ता है। कोई विचार?

धन्यवाद!

+1

मैं वस्तु कुंजी के विषय में किसी भी क्रम पर भरोसा नहीं होता। यदि इसकी आवश्यकता है, तो 'ऑब्जेक्ट.कीज()' का उपयोग करके कुंजी निकालें, उन्हें सॉर्ट करें और फिर क्रमबद्ध क्रम में गुणों तक पहुंचें। – Sirko

+0

एचएम। अच्छा विचार। आइए – frequent

+0

आज़माएं इसे भी पढ़ें: [यह] (http://stackoverflow.com/questions/12388412/js-object-key-sequence) और [यह] (http://stackoverflow.com/questions/280713/elements- ऑर्डर-इन-ए-इन-इन-लूप) –

उत्तर

31

जावास्क्रिप्ट ऑब्जेक्ट्स में गारंटीकृत अंतर्निहित आदेश नहीं है, इसलिए "रिवर्स" ऑर्डर मौजूद नहीं है।

4.3.3 ऑब्जेक्ट एक ऑब्जेक्ट प्रकार ऑब्जेक्ट का सदस्य है। यह अनियंत्रित संग्रह गुणों में से प्रत्येक जिनमें से एक आदिम मूल्य, वस्तु या फ़ंक्शन शामिल है। ऑब्जेक्ट की किसी संपत्ति में संग्रहीत फ़ंक्शन को विधि कहा जाता है।

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

// f is a function that has the obj as 'this' and the property name as first parameter 
function reverseForIn(obj, f) { 
    var arr = []; 
    for (var key in obj) { 
    // add hasOwnPropertyCheck if needed 
    arr.push(key); 
    } 
    for (var i=arr.length-1; i>=0; i--) { 
    f.call(obj, arr[i]); 
    } 
} 

//usage 
reverseForIn(obj, function(key){ console.log('KEY:', key, 'VALUE:', this[key]); }); 

कार्य JsBin: http://jsbin.com/aPoBAbE/1/edit

फिर मैं कहता हूँ कि

एक साधारण समारोह ब्राउज़र की for..in द्वारा दिए गए कि के रूप में उलटे क्रम में प्रत्येक संपत्ति के लिए एक फ़ंक्शन को कॉल करने, यह है for..in के आदेश की गारंटी नहीं है, इसलिए रिवर्स ऑर्डर की गारंटी नहीं है। सावधानी से प्रयोग करें!

+0

मैंने किसी ऑब्जेक्ट की बजाय सरणी का उपयोग करके समाप्त किया, क्योंकि सॉर्ट करना और रिवर्स करना आसान है। धन्यवाद वैसे भी – frequent

+0

बुद्धिमान विकल्प। आपका उपयोग केस एक सरणी की तरह लगता है एक बेहतर फिट है। – Tibos

+0

इस समाधान से प्यार है। मुझे एक ऑब्जेक्ट का उपयोग करना था ... धन्यवाद आदमी, आप अधिक अपवर्तनीय हैं। – PaoloCargnin

5

किसी ऑब्जेक्ट के पीछे लूप करने का कोई तरीका नहीं है, लेकिन यदि आप ऑब्जेक्ट को रिवर्स ऑर्डर में फिर से बनाते हैं तो आप सुनहरे होते हैं! सावधानियों तथापि रहो, कुछ भी नहीं कहा गया है कि के रूप में यह बदलता है और इसलिए इसमें कुछ दिलचस्प परिणाम के लिए नेतृत्व कर सकते हैं, लेकिन सबसे अधिक भाग के लिए यह काम करता है वस्तु के क्रम वैसा ही रहेगा वहाँ है ...

function ReverseObject(Obj){ 
    var TempArr = []; 
    var NewObj = []; 
    for (var Key in Obj){ 
     TempArr.push(Key); 
    } 
    for (var i = TempArr.length-1; i >= 0; i--){ 
     NewObj[TempArr[i]] = []; 
    } 
    return NewObj; 
} 

बस पाश तो कैसा लगेगा इस-

MyObject = ReverseObject(MyObject); 

की तरह अपने वस्तु पर अदला-बदली करते इस-

for (var KeysAreNowBackwards in MyObject){ 
    alert(MyObject[KeysAreNowBackwards]); 
} 
+3

कुछ बदलाव हैं जो मैं सुझाव देना चाहता हूं: _line 3_ 'var NewObj = {} 'इस तरह से हम सरणी के बजाय ऑब्जेक्ट लौटाते हैं, _line 8_' न्यूओबीजे [TempArr [i]] = Obj [TempArr [i]] ; क्योंकि आपका कोड खाली सरणी लौटाता है –

2

आप एक के अंदर उलटे क्रम में अपने आइटम को स्टोर करने के unshift समारोह का उपयोग कर सकते एन सरणी

function reverse(items, func){ 
    var reversed = Array(); 
    for(var key in items){ 
     reversed.unshift(items[key]); 
    } 
    if(func){ 
     for(var key in reversed){ 
      func(key, reversed[key]); 
     } 
    } 
    return reversed; 
} 

प्रयोग

// Loop through your object in reverse order 
reverse(foo, function(key, obj){ 
    console.log(key, obj); 
}); 

// Get a reversed copy of your object 
var reversedObject = reverse(foo); 

// Loop through your object in reverse order and get a reversed copy 
var reversedObject = reverse(foo, function(key, obj){ 
    console.log(key, obj); 
}); 
संबंधित मुद्दे