كيفية فرز مجموعة مع عناصر غير محددة في IE7 JavaScript

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

  •  04-10-2019
  •  | 
  •  

سؤال

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

<html>
<head>
<script type="text/javascript">
function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (loop in myArray) {
        output += myArray[loop].id + ' ';
    }
    alert(output);
}
</script>
</head>
<body onLoad="runscript();">
</body>

يظهر التنبيه () في النهاية غير مفهوم 0 2 3 4 5 1. إزالة العنصر غير المحدد من الصفيف بشكل صحيح وفرزه ويظهر التنبيه 0 1 2 3 4 5.

هل هناك طريقة للتغلب على هذا في IE7 حتى أتمكن من فرز المصفوفات بشكل موثوق والتي تشمل عناصر غير محددة؟ لا يهمني حيث تنتهي العناصر غير المحددة طالما يتم فرز العناصر المحددة بشكل صحيح.

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

المحلول

حاول التغيير for (loop in myArray) إلى for (var loop=0; loop<myArray.length; loop++):

function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (var loop=0; loop<myArray.length; loop++) {
        output += (myArray[loop]||{id: 'undefined'}).id + ' ';
    }
    alert(output);
}
runscript()

عند استخدام for (x in object) العناصر ليست مضمونة لتكون في حالة جيدة. أنظر أيضا لماذا استخدام "for ... in" مع تكرار الصفيف فكرة سيئة؟

(التنبيهات أعلاه 0 1 2 3 4 5 undefined)

تعديل: Undeleted - لقد اختبرت ما سبق ويعمل: p

نصائح أخرى

ربما يمكنك تعديل المقارن الخاص بك

myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });

بادئ ذي بدء ، فإن وظيفة الفرز الخاصة بك خاطئة حيث من المتوقع أن تعود -1 أو 0 أو +1 ، وليس قيمة منطقية.
استخدم هذا بدلاً من ذلك

var arr = [.....]
arr.sort((function(a, b){
    if (!a || !b) {
        // Here you choose how to treat undefined/null elements
        return 0;
    }  
    return (a[index].id === b[index].id ? 0 : (a[index].id < b[index].id ? -1 : 1));
})

ولكن فقط حتى تعرف أن حلقة لك سوف ترمي خطأ عند محاولة إعادة id خاصية من العنصر غير المحدد. أيضا ، يجب ألا تستخدم أبدا for..in حلقة لتكرارها على صفيف ، استخدم إما حلقة مع مؤشر زيادة أو عكس ذلك

var l = arr.length; 
while (l--) {
    ..
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top