2012-03-28 19 views
5

ich ein Objekt haben, wie folgt:Javascript .length falsch in IE

var dataSources = [ 
     { 
      Stage: [2, 3, 4], 
      Name: "GetAustralianStateList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetGenderList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetTitleList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetCountryList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetRegionList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetNonEnglishLanguageList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetContactRelationshipList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetCompanyCodeList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetBusinessContractList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetPayrollAreaList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetAdministrationAreaList" 
     }, 
     { 
      Stage: [3, 4], 
      Name: "GetWorkContractList" 
     }, 
     { 
      Stage: [2, 3, 4], 
      Name: "GetFirstLanguageList" 
     }, 
    ]; 

Als ich dataSources.length in Chrome Aufruf gibt es die richtige Anzahl der Elemente in dem Objekt. Der Internet Explorer gibt jedoch eine Länge von 14 - 1 mehr zurück, als tatsächlich im Objekt vorhanden ist.

Irgendwelche Ideen?

Antwort

6

Leider haben Sie eine der sehr wenigen Bugs in ECMAScript-Implementierungen entdeckt: IE behandelt ein einzelnes Komma in einem Arrayliteral als elision, so erhöht sie die Länge von einem:

var a = [0,1,]; 

alert(a.length); // 3 in IE 
        // 2 in other browsers 

a.hasOwnProperty('2'); // false in all browsers 

die oben zeigt, dass das Komma IE als elision behandelt: die Länge um eins erhöht wurde, aber es ist kein Mitglied des Arrays bei Index 2.

8

Sehen Sie die , nach dem letzten Objekt?

IE sieht ein elided Element deswegen.

+0

Doh. Schuljunge Fehler! Vielen Dank – Darbio

1

Sie sollten das letzte „,“, wie diese löschen:

{ 
     Stage: [2, 3, 4], 
     Name: "GetFirstLanguageList" 
    } 
]; 
1

Dies kann auch passieren, wenn Arrays mit "Push" erstellt werden. Ich habe es so mit Code getroffen:

var Entries = new Array; 
...some loop that adds entries... 
Entries.push(createEntry(values)); 

Die Funktion create von ‚Werten‘ Array eine Überprüfung tun würde, und wenn diese Überprüfung fehlgeschlagen ist, würde einfach keinen Wert zurück. Der undefinierte Wert würde dann in das Entries-Array geschoben werden. Wenn dieser undefinierte Eintrag der "letzte" Wert wäre, würde er in I.E. Browser. Um es zu beheben, habe ich verwendet:

var Entries = new Array; 
...loop to add entries... 
var Entry = createEntry(values); 
if(Entry) Entries.push(Entry); 

Grundsätzlich, schieben Sie nicht Zeug in ein Array, wenn es undefiniert ist.