আমার একটি জাভাস্ক্রিপ্ট অবজেক্টটি কাস্টম কীগুলির সাহায্যে অ্যারে হিসাবে বিবেচনা করে লুপ করা দরকার। আমি জানি এটি সম্পূর্ণরূপে সমর্থিত নয়, কারণ সম্পত্তিগুলির কোনও সহজাত আদেশ নেই, তবে যেহেতু আমি সবসময় বৈশিষ্ট্যগুলিকে পুনরায় অর্ডার করি, আমি এই পদ্ধতিকে সহজ এবং নির্ভরযোগ্য বলে মনে করি ... এখন অবধি।
কীগুলি সংখ্যা বা স্ট্রিংগুলি যখন সংখ্যা হিসাবে কাস্ট করা যায় তখন সমস্যা দেখা দেয়।
যখন আমি এই কোডটি চালাই:
var test1 = {4294966222:"A",4294966333:"A",4294966111:"A"};
var test2 = {4294968222:"A",4294968333:"A",4294968111:"A"};
for (var k in test1) {console.log(k);}
console.log("---");
for (var k in test2) {console.log(k);}
আউটপুটটি হ'ল:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
যার অর্থ:
- (test1) কীগুলি যদি 2 ^ 32 (4,294,967,296) এর নীচে থাকে তবে সেগুলি স্বয়ংক্রিয়ভাবে পুনঃক্রম হয়, প্রথমে ক্ষুদ্রতম
- (test2) কীগুলি যদি 2 ^ 32 এর উপরে হয় তবে সেগুলি পুনরায় অর্ডার করা হয় না।
প্রশ্ন হ'ল কেন এমন হচ্ছে?
যেহেতু আমি পরীক্ষিত সমস্ত ব্রাউজারগুলি (গুগল ক্রোম .0৯.০, মোজিলা ফায়ারফক্স .0১.০, মাইক্রোসফ্ট এজ ৪৪.১৩8362২, ইন্টারনেট এক্সপ্লোরার ১১.৫৩৫) এই আউটপুট সম্পর্কে একমত, তাই এখানে কিছু সরকারী বিবরণ থাকতে হবে।
হালনাগাদ
এটি একটি প্রান্তিক বিষয় ছিল তা খুঁজে বের করার আগে আমি প্রচুর সংখ্যা পরীক্ষা করেছিলাম। আমি অদ্ভুত দেখতে পেলাম যে ক্রমটি 2,3,1 একইভাবে অর্ডার করা তিন টাইমস্ট্যাম্পগুলির চেয়ে আলাদা আচরণ করে।
test1এবং দেখতে পারেন test2। আমি মনে করি "ইস্যু "টি অনুমানটির ভি 8 বাস্তবায়নের মূল ক্যাশিং থেকে এসেছে।
4294968333এবং 4294968111তার চেয়ে অনেক বেশী হয় 2 ** 32(যা 4294967296)। সুতরাং, তারা অ্যারে সূচক নয়, সুতরাং তারা সংখ্যার ক্রমের পরিবর্তে সম্পত্তি তৈরির ক্রমে পুনরাবৃত্তি করেছে - যা প্রত্যাশার মতো তারা ফ্রেডে করছে। (আমার উত্তর দেখুন)
