2010-07-06 7 views
24

मैंने देखा है कि कुछ कोड जो ई-कॉमर्स साइट के लिए कुछ जूता आकार का मूल्यांकन करते हैं और उन्हें स्क्रीन पर आउटपुट करते हैं, क्रोम में ऑर्डर को गड़बड़ कर रहे हैं।क्रोम री-ऑर्डरिंग ऑब्जेक्ट कुंजियां यदि संख्यात्मक हैं, तो सामान्य/अपेक्षित

JSON हो सकता दिया:

{ 
    "7": ["9149", "9139", "10455", "17208"], 
    "7.5": ["9140", "9150", "10456", "17209"], 
    "8": ["2684", "9141", "10457", "17210"], 
    "8.5": ["9142", "10444", "10458", "17211"], 
    "9": ["2685", "9143", "10459", "17212"], 
    "9.5": ["10443", "9144", "10460", "17213"] 
} 

... जो हिस्सों में आकार बढ़ा देता है।

एक वस्तु में रूपांतरण और हालांकि चाबियाँ पुनरावृत्ति होने पर, प्राकृतिक व्यवस्था का सम्मान किया जा रहा है और वे के रूप में बाहर आते हैं:

7, 7.5, 8, 8.5 आदि

लेकिन में क्रोम केवल, कुंजी उस दौर संख्या हमेशा पहली वस्तु से बाहर आते हैं, इसलिए की एक के लिए ... पाश में है उत्पादन की तरह 'देखो':

7, 8, 9, 7। 5, 8.5, 9.5 ...

Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"] 

यहाँ परीक्षण का मामला है: https://jsfiddle.net/wcapc46L/1/

यह केवल पूर्ण संख्याओं को प्रभावित करता है है लगता है वेबकिट/Blink एक अनुकूलन कि पसंद वस्तु गुण हैं कि है संख्यात्मक, शायद यह शाखा भविष्यवाणी या जो कुछ भी करना है।

आप किसी भी चरित्र के साथ वस्तु कुंजी उपसर्ग है, तो आदेश अप्रभावित रहता है और अपेक्षित तरीके से काम - फीफो

मुझे लगता है कि मैं पढ़ने याद है वहाँ एक वस्तु के गुणों के आदेश पर, लेकिन एक ही में इसकी कोई गारंटी नहीं है कि समय, यह चरम पर परेशान है और अकेले क्रोम उपयोगकर्ताओं के लिए इसे ठीक करने में काफी प्रयास करेगा।

कोई विचार? क्या यह एक बग है जो तय हो जाएगा?

http://code.google.com/p/v8/issues/detail?id=164

Blink ऐसा लगता है कि इसे ठीक करने के लिए नहीं करना चाहते और केवल उस ब्राउज़र होगा रहेगा:

संपादित अतिरिक्त, अब मैं v8 बग ट्रैकर पर एक मुद्दे के रूप में यह पता चला है कर दो।

अद्यतन जो कुछ भी हैश तालिका अनुकूलन वेबकिट/झपकी था, अब छिपकली में अपना रास्ता बना दिया है (एफएफ 27.0.1) - http://jsfiddle.net/9Htmq/ परिणाम 7,8,9,7.5,8.5,9.5 में। चाबियां सही/अपेक्षित आदेश लौटने से पहले _ लागू कर रही हैं।

अद्यतन 2017 लोग अभी भी upvoting और यह इतना संपादन कर रहे हैं - यह प्रभावित करने के लिए Map/WeakMap, Set आदि (के रूप में अद्यतन मुख्य उदाहरण द्वारा प्रदर्शन)

+0

+1। – spender

+4

मुझे लगता है कि आपको यहां योजना बनाने की अपनी विधि को पुनर्व्यवस्थित करने की आवश्यकता है। यदि आपने * पढ़ा है कि आदेश अपरिभाषित है, तो आप अब बहुत सारे कोड को ठीक करने के बारे में शिकायत क्यों कर रहे हैं जब आप अब * आश्चर्यचकित आश्चर्य * खोजते हैं, यह अनिर्धारित है? यह एक बग नहीं है जिसे तय किया जाएगा, अन्य यह कहने के लिए कि बग आपके कोड में है, आपने दस्तावेज़ीकृत व्यवहार पर नहीं, कार्यान्वयन विवरण पर भरोसा किया है। अपना कोड ठीक करें। विकास के समय –

+1

, क्रोम कहीं भी नहीं था और अब यह 7% साइट उपयोगकर्ताओं के लिए है। क्रोम के साथ आने तक, यह सभी ब्राउज़रों के रूप में काम करता था, सफारी शामिल था - इसलिए यह एक वेबकिट मुद्दा नहीं है।और हाँ, मुझे समझ में आता है कि इसे रीफैक्टरिंग की आवश्यकता हो सकती है लेकिन एक आसान समाधान की आशा की जा रही थी (या क्रोम वास्तव में इसे हर किसी की तरह ठीक कर देगा)। अभी के लिए, मुझे परिभाषा के प्राकृतिक क्रम को मजबूर करने के लिए __ या कुछ के साथ सभी ऑब्जेक्ट गुणों को उपसर्ग करना पड़ सकता है। –

उत्तर

20

यह वही तरीका है जो v8 सहयोगी सरणी संभालता है। एक ज्ञात मुद्दा Issue 164 लेकिन यह spec का पालन करता है इसलिए चिह्नित 'इरादे के रूप में काम कर रहा है'। सहयोगी सरणी के माध्यम से लूपिंग के लिए एक आवश्यक आदेश नहीं है।

एक सरल समाधान का पत्र के साथ संख्या मान पूर्व में होना करने के लिए है उदाहरण के लिए: 'size_7':['9149','9139'] आदि

मानक अगले ECMAScript कल्पना मजबूर कर [क्रोम] डेवलपर्स इसे बदलने के लिए में बदल जाएगा।

+1

क्रोम के वर्तमान कार्यान्वयन के पक्ष में या परिभाषा के आदेश को संरक्षित करने के पक्ष में परिवर्तन? –

+2

आदेश को संरक्षित करने के बाद से अन्य सभी ब्राउज़र पहले से ही ऐसा करते हैं। –

+0

भयानक खबर! बहुत बहुत धन्यवाद। –

1

ऐसा लगता है कि क्रोम इलाज है प्रकट नहीं होता है पूर्णांक स्ट्रिंग जैसे कि यह सूचकांक/संपत्ति नाम के रूप में उपयोग किए जाने पर एक संख्यात्मक प्रकार था।

मुझे लगता है कि कुछ मामलों में, ऑब्जेक्ट गुण हैं, और अन्य मामलों में (निश्चित रूप से क्रोम के साथ) सरणी सूचकांक, क्रमशः एक असुरक्षित दृष्टिकोण और गणना का क्रम संभवतः नहीं है, के क्रम में संरक्षित करने के लिए जावास्क्रिप्ट कार्यान्वयन पर निर्भर है। कल्पना में परिभाषित किया गया। मैं JSON कि एक तरह से आदेश को इंगित करता लिए एक अतिरिक्त संपत्ति जोड़ने का सुझाव होगा:

{ 
    "7":{"sortOrder":1,"data":["9149","9139","10455","17208"]}, 
    "7.5":{"sortOrder":2,"data":["9140","9150","10456","17209"]} 
    //etc 
} 
+0

जो काम कर सकता है - मैं एक फ़िल्टर लागू कर सकता हूं जो लूपिंग पर sortOrder प्रॉपर्टी की जांच करता है और डीओएम में तदनुसार तत्वों को इंजेक्ट करता है। –

0

मुझे नहीं लगता कि आप यह एक बग कॉल कर सकते हैं करते हैं। जैसा कि आप स्वयं कहते हैं, इस पर कोई गारंटी नहीं है कि ऑब्जेक्ट के गुणों को कैसे क्रमबद्ध किया जाता है।

+0

और यह कोई जवाब नहीं है। –

1

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

{"7.0":["9149","9139","10455","17208"],"7.5":["9140","9150","10456","17209"],"8.0":["2684","9141","10457","17210"],"8.5":["9142","10444","10458","17211"],"9.0":["2685","9143","10459","17212"],"9.5":["10443","9144","10460","17213"]} 

तो, "8.0" के बजाय "8" का, आदि

फिर भी, वहाँ कोई गारंटी नहीं है, लेकिन यह अधिक संभावना है कि वे उसी क्रम में बाहर आ जाएगा।

एक बेहतर गारंटी के लिए, चाबियों के आधार पर एक प्रकार का प्रदर्शन करें, क्रमबद्ध क्रम में मानों को सरणी में डालें।

+0

अफसोसपूर्वक, भले ही यह परीक्षण मामले के लिए काम करेगा, यह कार्यान्वयन के लिए एक विकल्प नहीं होगा। मर्चेंट द्वारा प्रति-उत्पाद आधार पर परिभाषित अनुसार, आकार 'एस, एम, एल, एक्सएल, एक्सएक्सएल' या '44, 44.5,44.5 'या' वन साइज 'जैसे विभिन्न विकल्पों की भीड़ हैं। MYSQL से आउटपुट को क्रमबद्ध करने में जबरदस्त तर्क शामिल है, इसलिए यह सही क्रम में आता है, न कि स्ट्रिंग्स के रूप में - इसमें वरीयता के क्रम में 40 अलग-अलग आकार पूर्व-परिभाषित होते हैं। –

1

किसी ऑब्जेक्ट के गुणों पर पुनरावृत्ति करते समय, आदेश को ईसीएमएस्क्रिप्ट विनिर्देश में निर्दिष्ट नहीं किया गया है और कुछ वातावरण में आपके द्वारा देखे गए किसी भी आदेश पर भरोसा नहीं किया जाना चाहिए। अगर आपको ऑर्डर चाहिए, तो Array का उपयोग करें।

0

मैं Underscore.js का उपयोग कर

myArray = _.sortBy(myArray, function(num){ return Math.ceil(num); }); 

Yay चारों ओर एक आसान काम मिल गया! myArray सभी ब्राउज़रों में सही क्रम पर वापस आ गया है। एक परीक्षण मामले के लिए

संबंधित मुद्दे