2012-03-28 17 views
5

Tengo un objeto de la siguiente manera:Javascript .length incorrectos en 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" 
     }, 
    ]; 

Cuando llamo dataSources.length en Chrome devuelve el número correcto de los elementos del objeto. Sin embargo, Internet Explorer devuelve una longitud de 14 a 1 más de lo que realmente está en el objeto.

¿Alguna idea?

Respuesta

6

desgracia que ha descubierto uno de los muy pocos errores en las implementaciones ECMAScript: IE trata una sola coma final en un literal de matriz como una elision, por lo que se incrementa la longitud por uno:

var a = [0,1,]; 

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

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

lo anterior muestra que IE trata la coma como una elisión: la longitud se ha incrementado en uno, pero no hay ningún miembro de la matriz en el índice 2.

8

Ver el , después del último objeto?

IE ve un elemento eliminado debido a ello.

+0

Doh. ¡Error de colegial! Gracias – Darbio

1

Debería eliminar el último ",", así:

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

Esto también puede ocurrir al construir matrices con 'push'. He golpeado con un código como éste:

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

La función createEntry haría algún tipo de verificación de array 'valores', y si esa verificación no, habría devuelva ningún valor. El valor indefinido se insertaría en la matriz Entradas. Si esta entrada indefinida fuera el 'último' valor, fallaría en I.E. navegadores. Para solucionarlo, utilicé:

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

Básicamente, no inserte cosas en una matriz si no está definida.