جوجل كروم:صفائف جافا سكريبت الترابطية، تم تقييمها خارج التسلسل

StackOverflow https://stackoverflow.com/questions/640745

سؤال

حسنًا، في صفحة الويب، لدي كائن JavaScript أستخدمه كمصفوفة ترابطية.يوجد هذا بشكل ثابت في كتلة البرنامج النصي عند تحميل الصفحة:

var salesWeeks = {
    "200911" : ["11 / 2009", "Fiscal 2009"],
    "200910" : ["10 / 2009", "Fiscal 2009"],
    "200909" : ["09 / 2009", "Fiscal 2009"],
    "200908" : ["08 / 2009", "Fiscal 2009"],
    "200907" : ["07 / 2009", "Fiscal 2009"],
    "200906" : ["06 / 2009", "Fiscal 2009"],
    "200905" : ["05 / 2009", "Fiscal 2009"],
    "200904" : ["04 / 2009", "Fiscal 2009"],
    "200903" : ["03 / 2009", "Fiscal 2009"],
    "200902" : ["02 / 2009", "Fiscal 2009"],
    "200901" : ["01 / 2009", "Fiscal 2009"],
    "200852" : ["52 / 2008", "Fiscal 2009"],
    "200851" : ["51 / 2008", "Fiscal 2009"]
};

ترتيب أزواج المفتاح/القيمة مقصود، حيث أقوم بتحويل الكائن إلى مربع تحديد HTML مثل هذا:

<select id="ddl_sw" name="ddl_sw">
<option value="">== SELECT WEEK ==</option>
<option value="200911">11 / 2009 (Fiscal 2009)</option>
<option value="200910">10 / 2009 (Fiscal 2009)</option>
<option value="200909">09 / 2009 (Fiscal 2009)</option>
<option value="200908">08 / 2009 (Fiscal 2009)</option>
<option value="200907">07 / 2009 (Fiscal 2009)</option>
<option value="200906">06 / 2009 (Fiscal 2009)</option>
<option value="200905">05 / 2009 (Fiscal 2009)</option>
<option value="200904">04 / 2009 (Fiscal 2009)</option>
<option value="200903">03 / 2009 (Fiscal 2009)</option>
<option value="200902">02 / 2009 (Fiscal 2009)</option>
<option value="200901">01 / 2009 (Fiscal 2009)</option>
<option value="200852">52 / 2008 (Fiscal 2009)</option>
<option value="200851">51 / 2008 (Fiscal 2009)</option>
</select>

...برمز يشبه هذا (مقتطع من دالة):

var arr = [];
arr.push(
    "<select id=\"ddl_sw\" name=\"ddl_sw\">" +
    "<option value=\"\">== SELECT WEEK ==</option>"
);

for(var key in salesWeeks)
{
    arr.push(
        "<option value=\"" + key + "\">" +
        salesWeeks[key][0] + " (" + salesWeeks[key][1] + ")" +
        "<\/option>"
    );
}

arr.push("<\/select>");

return arr.join("");

كل هذا يعمل بشكل جيد في IE، FireFox وOpera.

ولكن في Chrome، يبدو الأمر غريبًا تمامًا:

<select id="ddl_sw" name="ddl_sw">
<option value="">== SELECT WEEK ==</option>
<option value="200852">52 / 2008 (Fiscal 2009)</option>
<option value="200908">08 / 2009 (Fiscal 2009)</option>
<option value="200906">06 / 2009 (Fiscal 2009)</option>
<option value="200902">02 / 2009 (Fiscal 2009)</option>
<option value="200907">07 / 2009 (Fiscal 2009)</option>
<option value="200904">04 / 2009 (Fiscal 2009)</option>
<option value="200909">09 / 2009 (Fiscal 2009)</option>
<option value="200903">03 / 2009 (Fiscal 2009)</option>
<option value="200905">05 / 2009 (Fiscal 2009)</option>
<option value="200901">01 / 2009 (Fiscal 2009)</option>
<option value="200910">10 / 2009 (Fiscal 2009)</option>
<option value="200911">11 / 2009 (Fiscal 2009)</option>
<option value="200851">51 / 2008 (Fiscal 2009)</option>
</select>

ملحوظة:هذا الترتيب، على الرغم من غرابته، لا يتغير في التحديثات اللاحقة.إنه دائمًا بهذا الترتيب.

إذًا، ما الذي يفعله Chrome؟بعض التحسين في كيفية معالجة الحلقة؟

في المقام الأول، هل أخطئ في الاعتماد على الترتيب الذي يتم به الإعلان عن أزواج المفتاح/القيمة أي مصفوفة متصلة؟

لم أتساءل أبدًا عن ذلك من قبل، لقد افترضت فقط أن الطلب سيستمر لأن هذه التقنية كانت تعمل دائمًا معي في المتصفحات الأخرى.لكنني أفترض أنني لم أر قط أنه يُذكر في أي مكان أن الطلب مضمون.ربما لا؟

أي فكرة ستكون رائعة.شكرًا.

هل كانت مفيدة؟

المحلول

وفكر في مجموعة النقابي باعتباره كيس الورق إلى التي توضع جميع أزواج قيمة المفتاح. كما يمكنك الوصول إلى يدك في كيس للنظر في أزواج (مثل مع ل... في حلقة)، الترتيب الذي واجهتك لهم هو لجميع الأغراض العملية عشوائي.

إذا كنت تريد أن ترى منهم في ترتيب معين، سوف تحتاج إلى استخراج المفاتيح في صفيف وترتيب هذا الامر. ثم السير عبر مجموعة، وذلك باستخدام مفاتيح واجهتك لمؤشر في مجموعة النقابي.

نصائح أخرى

لا يضمن الترتيب الذي يتم تخزين العناصر في مجموعة النقابي. سيكون لديك لفرز الإخراج صراحة.

وكما يقول إجابات أخرى، والترتيب الذي يتم كرر خصائص الكائن غير معرف في المواصفات، على الرغم من المتصفحات الرئيسية كل أعاد لهم وفق الترتيب الذي تحدده.

وسوف كروم تعداد لهم من أجل جدا، إذا كان كل من خصائص الكائن تحتوي على قيم البدائية. جون ريسيغ يعطي المزيد من التفاصيل عن سلوك كروم هنا (تحت عنوان "لأجل حلقة"): http://ejohn.org/blog/javascript-in-chrome/

وكما أشار السلوك كروم هو صحيح تماما.

وهذه هي حالة جيدة من حيث بعض التفكير OO يمكن أن تساعد. هل تريد حقا مجموعة النقابي أو مجرد قائمة من الأشياء؟

var salesWeeks = [
    ["200911", "11 / 2009", "Fiscal 2009"],
    ...
]
...
for(var key in salesWeeks)
{
    arr.push(
        "<option value=\"" + salesWeeks[key][0] + "\">" +
        salesWeeks[key][1] + " (" + salesWeeks[key][2] + ")" +
        "<\/option>"
    );
}

وسوف خدمتك بشكل أفضل وأعتقد أن (لتلك التي دعا شكلا من أشكال الفرز، يتم تعريف الأمر بالفعل - لماذا تريد أن تفعل العمل الاضافي)

وcurtainDog: NO! لا! باستخدام "ل.. في" مع كائنات صفيف في جافا سكريبت هو سيء - نقطة كاملة لمعظم الردود هنا هي أن "ل.. في" لا يضمن أي ترتيب. وعلاوة على ذلك، "ل.. في" والاستيلاء على الممتلكات من النموذج منشئ الكائن ولن تكرار عبر مفاتيح غير موجود.

وSamnan: إن المواصفات تقول ببساطة أن النظام التكرار غير مضمون. وهذا يعني أن المتصفحات أحرار في تكرار في ترتيب فرزها، وذلك من الإدراج، في ترتيب عشوائي، أو مهما إلا فإنها قد. انها مجرد مثل جدول تجزئة - أعتقد أنها عشوائية، حتى لو كان يحدث أن يخرج في بعض الأمر واضح

وأنا متأكد إلى حد ما معظم برامج التصفح للبحث عن "for..in" مع كائنات صفيف وتكرار في ترتيب رقمي حتى أن الأمور لا تنكسر. ومع ذلك، فإنه لا يقوم بذلك حقا ما معظم الناس الذين يستخدمونها بهذه الطريقة اعتقد انه يفعل، وينبغي تجنبها إلا إذا كنت بحاجة على وجه التحديد <م> الكائن من نوع التكرار.

وانها ليست ممارسة جيدة حقيقية ولكن ...

إذا قمت بإضافة مسافة إلى الكروم قيمة لن ينظر في قيمتها رقما ولن فرزها من حيث القيمة.

مثال:

<select>
  <option value=" 3">Third</option>
  <option value=" 1">First</option>
  <option value=" 2">Second</option>
</select>

والجانب الجيد هو أن لديك عدم إضافة ثم إزالة الأحرف الأبجدية من ID كمن اقترح (لا أتذكر إذا كان في هذا أو وظيفة أخرى مع سؤال مماثل)، هل يمكن بسهولة تقليم ذلك، ولكن أكثر من مرة ل يتم تجاهل الفضاء فقط، وإذا كنت في مرحلة أو الحصول على تلك إلى ملف آخر أنها ببساطة سوف ترى قيمة عدد صحيح وليس الفضاء.

على عكس جميع الإجابات الأخرى، فمن المؤكد أنه خطأ في الكروم

السبب:

إذا كانت بنية البيانات عبارة عن كيس ورقي كما قال باري:

يجب دائمًا أن تكون القيم عشوائية.هذا ليس هو الحال في الكروم

إذا كانت بنية البيانات متسلسلة، فعندئذٍ:

يجب أن تكون القيم بالتسلسل الذي تمت إضافتها به إلى البنية

بينما تتبع المتصفحات الأخرى النهج الثاني، لا يتبع Chrome أيًا منهما، ولا يوجد حتى الآن تفسير لترتيب الفرز الذي يشكله Chrome لبنية البيانات أثناء الوصول إليها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top