উপাদানগুলি একটি "জন্য (… ইন…)" লুপে অর্ডার করে


205

জাভাস্ক্রিপ্টের "জন্য ... ইন" লুপ কি হ্যাশট্যাবলগুলি / উপাদানগুলির ঘোষিত ক্রম অনুসারে লুপ করে? এমন কোনও ব্রাউজার রয়েছে যা এটি ক্রম করে না?
আমি যে অবজেক্টটি ব্যবহার করতে চাই তা একবার ঘোষিত হবে এবং কখনই সংশোধিত হবে না।

ধরুন আমার আছে:

var myObject = { A: "Hello", B: "World" };

এবং আমি এগুলিতে আরও ব্যবহার করি:

for (var item in myObject) alert(item + " : " + myObject[item]);

আমি কি আশা করতে পারি যে 'এ: "হ্যালো" "সর্বদা শালীন ব্রাউজারগুলিতে' বি:" ওয়ার্ল্ড "এর আগে আসবে?


61
তারা কেবলমাত্র সম্ভাব্য ব্রাউজার এবং বৈকল্পিকগুলির একটি উপসেট পরীক্ষা করবে testing ভবিষ্যতের কোনও ব্রাউজার উল্লেখ না করা। এটি ব্যর্থতাযুক্ত পরীক্ষাটি যে কোনও প্রকারের কংক্রিট প্রমাণ সরবরাহ করে তা অনুমান করা সোজা ভুল।
জেমস হিউজেস

6
আমি সন্দেহ করি আমার নিজের সীমিত জাভাস্ক্রিপ্ট ক্ষমতা এসও ভিড়ের চেয়ে ভাল হবে। এছাড়াও সেখানে কী অদ্ভুত ব্রাউজার লুকিয়ে আছে তা কে জানে? এবং আপনি উত্তরে দেখতে পারেন যে জিচ্রোমে একটি বাগ রয়েছে যা আমার সাধারণ উদাহরণের ক্ষেত্রে আপাত হবে না।
চক্রত


উত্তর:


214

জন রেসিগের উদ্ধৃতি :

বর্তমানে সমস্ত বড় ব্রাউজার কোনও বস্তুর বৈশিষ্ট্য অনুসারে লুপ করে যার ক্রমটি সংজ্ঞায়িত করা হয়েছিল। Chrome একটি দু'টি কেস বাদে এটিও করে। [...] এই আচরণটি ECMAScript স্পেসিফিকেশন দ্বারা সুস্পষ্টভাবে অপরিবর্তিত রেখে গেছে। ইসিএমএ -262-এ, বিভাগ 12.6.4:

বৈশিষ্ট্যগুলি গণনা করার প্রক্রিয়াগুলি ... বাস্তবায়ন নির্ভর।

তবে স্পেসিফিকেশন বাস্তবায়ন থেকে একেবারে পৃথক। ইসমাস্ক্রিপ্টের সমস্ত আধুনিক বাস্তবায়নগুলি তাদের সংজ্ঞা অনুসারে ক্রমতে বস্তুর বৈশিষ্ট্যগুলির মাধ্যমে পুনরাবৃত্তি করে। এর কারণে ক্রোম দলটি এটি একটি বাগ হিসাবে ধরে নিয়েছে এবং এটি ঠিক করবে।

সমস্ত ব্রাউজারগুলি ক্রমিক এবং অপেরা বাদ দিয়ে সংজ্ঞা অর্ডারকে সম্মান করে যা প্রতিটি অ-সংখ্যাগত সম্পত্তি নামের জন্য করে। এই দুটি ব্রাউজারে বৈশিষ্ট্যগুলি প্রথম অ-সংখ্যাগত সম্পত্তির আগে ক্রমে টানানো হয় (এটি কীভাবে তারা অ্যারে প্রয়োগ করে তা নিয়ে কাজ করতে হবে)। অর্ডার Object.keysপাশাপাশি একই ।

এই উদাহরণটি এটি পরিষ্কার করে তোলে যা ঘটেছিল:

var obj = {
  "first":"first",
  "2":"2",
  "34":"34",
  "1":"1",
  "second":"second"
};
for (var i in obj) { console.log(i); };
// Order listed:
// "1"
// "2"
// "34"
// "first"
// "second"

এটি যে কোনও সময় পরিবর্তিত হতে পারে তার চেয়ে এর প্রযুক্তিগতাগুলি কম গুরুত্বপূর্ণ। এইভাবে থাকা জিনিসগুলির উপর নির্ভর করবেন না।

সংক্ষেপে: যদি আদেশটি আপনার পক্ষে গুরুত্বপূর্ণ হয় তবে একটি অ্যারে ব্যবহার করুন।


3
আসলে তা না. ক্রোম অন্যান্য ব্রাউজারগুলির মতো একই ক্রমটি
টিম ডাউন

19
"অর্ডার আপনার পক্ষে গুরুত্বপূর্ণ হলে একটি অ্যারে ব্যবহার করুন": আপনি যখন জেএসএন ব্যবহার করছেন তখন কী হবে?
এইচএম

11
@ এইচএম 2 কে, একই জিনিস, অনুমান অনুসারে "একটি বস্তু হ'ল শূন্য বা আরও বেশি নাম / মান জোড়ার একটি নিরক্ষিত সংগ্রহ collection" JSON জাভাস্ক্রিপ্ট নয়: আপনি যে অর্ডারটি দিয়েছেন তার কোনও সার্ভারের (এবং সম্ভবত তা হবে না) সম্মানের প্রয়োজন নেই।
বোরগার

7
ফায়ারফক্সের 21 সংস্করণ যেহেতু সন্নিবেশ আদেশটিকে আর সম্মান করবে বলে মনে হচ্ছে না।
ডক ডভলুজ

2
এই উত্তরটি ES2015 এ মিথ্যা।
বেনজামিন গ্রুয়েনবুম

54

এক বছর পরে এটিকে ধাক্কা দিয়ে ...

এটি 2012 এবং প্রধান ব্রাউজারগুলি এখনও পৃথক:

function lineate(obj){
    var arr = [], i;
    for (i in obj) arr.push([i,obj[i]].join(':'));
    console.log(arr);
}
var obj = { a:1, b:2, c:3, "123":'xyz' };
/* log1 */  lineate(obj);
obj.a = 4;
/* log2 */  lineate(obj);
delete obj.a;
obj.a = 4;
/* log3 */  lineate(obj);

বর্তমান ব্রাউজারে সংক্ষেপ বা পরীক্ষা

সাফারি 5, ফায়ারফক্স 14

["a:1", "b:2", "c:3", "123:xyz"]
["a:4", "b:2", "c:3", "123:xyz"]
["b:2", "c:3", "123:xyz", "a:4"]

ক্রোম 21, অপেরা 12, নোড 0.6, ফায়ারফক্স 27

["123:xyz", "a:1", "b:2", "c:3"]
["123:xyz", "a:4", "b:2", "c:3"]
["123:xyz", "b:2", "c:3", "a:4"]

IE9

[123:xyz,a:1,b:2,c:3] 
[123:xyz,a:4,b:2,c:3] 
[123:xyz,a:4,b:2,c:3] 

16
এখানে সমস্যা কি? স্পেসিফিকেশন ঠিক যেমনটি বলেছে, এটি কী / ভ্যাল জোড়াগুলির একটি নিরবচ্ছিন্ন তালিকা।
নিকফ

5
নিকফ: বাস্তবায়নগুলি সঠিক যে তারা অনুমান যা বলে তাই করে। আমি মনে করি সবাই জাভাস্ক্রিপ্টের স্পেকের সাথে একমত হয়ে আছে .. ঠিক আছে, আমি "ভুল" শব্দটি ব্যবহার করতে চাই না, "অত্যন্ত বোকা এবং বিরক্তিকর" কীভাবে? : পি
বক্সে

10
@ বাক্সযুক্ত: হ্যাশ মানচিত্র হিসাবে টেবিল সম্পর্কে চিন্তা করুন (টেবিল / যাই হোক না কেন)। বেশিরভাগ ভাষায় (জাভা, পাইথন ইত্যাদি) এই ধরণের ডেটা স্ট্রাকচারগুলি সাজানো হয় না। সুতরাং এটি আশ্চর্যজনক নয় যে এটি জাভাস্ক্রিপ্টেও একই ঘটনা এবং এটি অবশ্যই স্পেসিফিকেশনটিকে ভুল বা বোকা বানায় না।
ফেলিক্স ক্লিং

9
আমি এই উত্তরটির বিন্দুটি সত্যই দেখছি না (দুঃখিত)। যে ক্রমটিতে বৈশিষ্ট্যগুলি পুনরুক্ত করা হয় সেগুলি একটি প্রয়োগের বিশদ এবং ব্রাউজারগুলি বিভিন্ন জাভাস্ক্রিপ্ট ইঞ্জিন ব্যবহার করে, সুতরাং আশা করা যায় যে আদেশটি আলাদা হয়। এটি পরিবর্তন হবে না।
ফেলিক্স ক্লিং

2
কলা বাস্তবায়নের ক্ষেত্রে আপনি প্রকৃত অ্যারে দ্বারা ব্যাক হওয়ার কারণে সংখ্যার মান ক্রমে পূর্ণসংখ্যার বৈশিষ্ট্য পাবেন এবং লুকানো শ্রেণি / আকার গঠনের কারণে নামযুক্ত বৈশিষ্ট্য সন্নিবেশ ক্রমে পাবেন। পরিবর্তিত হতে পারে তা হ'ল তারা প্রথমে পূর্ণসংখ্যার বৈশিষ্ট্য তালিকাভুক্ত করে বা প্রথমে নাম চিহ্নিত করে। সংযোজনটি deleteআকর্ষণীয় কারণ কমপক্ষে ভি 8-এ, এটি তাত্ক্ষণিকভাবে হ্যাশ টেবিল দ্বারা অবজেক্টটিকে ব্যাক আপ করার কারণ করে। তবে সন্নিবেশ ক্রমে ভি 8 স্টোরের হ্যাশ টেবিল table এখানে সবচেয়ে আকর্ষণীয় ফলাফল আইই, আমি অবাক হয়েছি তারা
এটিকে

27

থেকে ECMAScript প্রোগ্রামিং ভাষা নির্দেশনা , বিভাগ 12.6.4 (চালু for .. inলুপ):

বৈশিষ্ট্য গণনা করার মেকানিক্স বাস্তবায়ন নির্ভর। গণনার ক্রমটি বস্তু দ্বারা সংজ্ঞায়িত করা হয়।

এবং বিভাগ 4.3.3 ("অবজেক্ট" এর সংজ্ঞা):

এটি প্রতিটি বৈশিষ্ট্যের একটি আনর্ডারড সংগ্রহ যা প্রতিটিগুলির মধ্যে একটি আদিম মান, বস্তু বা ফাংশন রয়েছে। কোনও বস্তুর সম্পত্তিতে সঞ্চিত ফাংশনকে একটি পদ্ধতি বলা হয়।

আমি অনুমান করি যে আপনি জাভাস্ক্রিপ্ট বাস্তবায়ন জুড়ে একটি ধারাবাহিক ক্রমে গুণিত বৈশিষ্ট্যগুলির উপর নির্ভর করতে পারবেন না। (কোনও ভাষার প্রয়োগ-সুনির্দিষ্ট বিবরণগুলির উপর নির্ভর করা কোনওভাবেই খারাপ স্টাইল হবে))

আপনি যদি নিজের অর্ডারটি সংজ্ঞায়িত করতে চান তবে আপনাকে কিছুটিকে এটি নির্ধারণ করতে হবে যা আপনাকে এটির সাথে অ্যাক্সেস করার আগে বাছাই করা কীগুলির অ্যারের মতো করবে def


10

গণনা করার জন্য / ইন করার জন্য কোনও সামগ্রীর উপাদানগুলি এমন বৈশিষ্ট্য যা ডন্টইনাম পতাকা সেট নেই have ইসমাস্ক্রিপ্ট, ওরফে জাভাস্ক্রিপ্ট, স্ট্যান্ডার্ডটি স্পষ্টতই বলেছে যে "একটি অবজেক্ট সম্পত্তিগুলির একটি নিরবচ্ছিন্ন সংগ্রহ" (দেখুন http://www.mozilla.org/js/language/E262-3.pdf বিভাগ 8.6)।

এটি জাভাস্ক্রিপ্টের বাস্তবায়নগুলি ঘোষণার ক্রম হিসাবে গণ্য হবে তা ধরে নেওয়ার জন্য মানদণ্ড (যেমন নিরাপদ) হবে না।


2
সে কারণেই তিনি কেবল ধরে নেওয়ার পরিবর্তে প্রশ্ন জিজ্ঞাসা করছেন: পি
জেমি প্যাট

4

বৈশিষ্ট্য মুছে ফেলার ক্ষেত্রে আইট্রেশন অর্ডারটি বিভ্রান্তও রয়েছে তবে কেবলমাত্র আইইয়ের সাথে এই ক্ষেত্রে।

var obj = {};
obj.a = 'a';
obj.b = 'b';
obj.c = 'c';

// IE allows the value to be deleted...
delete obj.b;

// ...but remembers the old position if it is added back later
obj.b = 'bb';
for (var p in obj) {
    alert(obj[p]); // in IE, will be a, bb, then c;
                   // not a, c, then bb as for FF/Chrome/Opera/Safari
}

পুনরাবৃত্তির ক্রমটি ঠিক করার জন্য স্পেকটি পরিবর্তন করার আকাঙ্ক্ষাকে বিকাশকারীদের মধ্যে বেশ জনপ্রিয় ইচ্ছা বলে মনে হচ্ছে যদি http://code.google.com/p/v8/issues/detail?id=164 এ আলোচনাটি কোনও ইঙ্গিত দেয়।


3

আই 6 এ, অর্ডারটি গ্যারান্টিযুক্ত নয়।


2

আদেশ বিশ্বাস করা যায় না। অপেরা এবং ক্রোম উভয়ই অর্ডারযুক্ত সম্পত্তিগুলির তালিকা ফিরিয়ে দেয়।

<script type="text/javascript">
var username = {"14719":"A","648":"B","15185":"C"};

for (var i in username) {
  window.alert(i + ' => ' + username[i]);
}
</script>

উপরের কোডটি অপেরাতে বি, এ, সি এবং ক্রোমে সি, এ, বি দেখায়।


1

এটি প্রতি সেমি প্রশ্নের উত্তর দেয় না, তবে মৌলিক সমস্যার সমাধান দেয়।

ধরে নিচ্ছি যে আপনি সংরক্ষণের জন্য নির্ভর করতে পারবেন না, কেন বৈশিষ্ট্য হিসাবে কী এবং মান সহ কোনও বস্তুর অ্যারে ব্যবহার করবেন না?

var myArray = [
    {
        'key'   : 'key1'
        'value' : 0
    },
    {
        'key'   : 'key2',
        'value' : 1
    } // ...
];

এখন, কীগুলি অনন্য কিনা তা নিশ্চিত করার বিষয়টি আপনার উপর নির্ভর করে (ধরে নিলেন এটি আপনার কাছে গুরুত্বপূর্ণও বটে। পাশাপাশি, সরাসরি সম্বোধনের পরিবর্তনগুলি এবং (... ইন ...) এর জন্য এখন সূচিগুলি 'কী' হিসাবে ফেরত দেয়।

> console.log(myArray[0].key);
key1

> for (let index in myArray) {console.log(myArray[index].value);}
0
1
কলম দেখতে পাচ্ছিনা? (... মধ্যে ...) অনুক্রমে অ্যাড্রেসিং জন্য JDQ (দ্বারা @JDQ দিকে) CodePen

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.