2011-04-08 33 views
6

Tengo el siguiente js matriz/objetomatriz JSON con propiedades

var x = [1,2,3,4]; 
x.name = "myArray"; 

estoy usando json2.js y yo estoy tratando de serializar x en una cadena. y todo lo que obtengo es la matriz: [1,2,3,4]

¿es correcto? dado que puedo agregar cualquier propiedad a una matriz ¿por qué json2 no maneja eso? ¿Qué me estoy perdiendo?

+1

¿Qué ** estás ** tratando de hacer? – Neal

+0

No puede agregar ninguna propiedad a una matriz. Las matrices son mapas de índices numéricos a valores. Técnicamente hablando, en Javascript puedes agregar cualquier propiedad a un objeto 'Array' porque están construidos encima del tipo' Object', aunque en realidad no se debe. ¿Cual es tu intencion? –

+2

¿Por qué sobrecargar la matriz? simplemente haz 'var x = {}; x.array = [1,2,3,4]; x.name = "myArray"; 'o haga que sea JSON para comenzar:' var x = {"name": "myArray", "array": [1,2,3,4]} ' – mplungjan

Respuesta

2
  1. En primer lugar, json2.js ignora las propiedades de la matriz.
  2. si no tuviera que ignorarlos, entonces sería imposible tener una matriz en formato json que debería ser fácil de evaluar.

Imaginemos que salir con algo como:

[1,2,3,4]{name:'test',anotherProperty:'someValue'} 

si lo anterior era válida Javascript para crear una matriz y se adhieren dos propiedades, entonces sería grande y podríamos JSON-it. Sería equivalente a hacer esto:

array = [1,2,3,4] 
array.name = 'test'; 
array.anotherProperty = 'someValue'; 

Pero no es y esa es la razón por la que no podemos persistir en JSON.

2

¿Qué esperabas ver? :) No estoy seguro de lo que estás tratando de hacer.

x es una matriz y todo lo que hizo cuando hizo x.name, simplemente configuró una propiedad llamada name para el objeto de matriz. La propiedad name en sí misma no se agrega a la matriz. Esto se puede ver en Firebug:

enter image description here

El objeto de matriz tiene una propiedad llamada name, pero el valor de esa propiedad no se añade a la propia matriz.

Lo que se quiere hacer es algo como esto:

var x = { 
    array: [1, 2, 3, 4], 
    name: "myArray" 
}; 

Ahora usted tiene un objeto llamado x que tiene dos propiedades. La propiedad array se refiere a una matriz y la propiedad name hace referencia al nombre. x.array le dará la matriz, y x.name le dará el nombre.

EDITAR

Esto es en respuesta a sus comentarios. Si bien es cierto que las matrices se pueden enriquecer con propiedades, piense en lo que significa cuando tiene que serializar ese objeto. ¿Qué es exactamente lo que quieres ver cuando serializas x? Si x ya es la matriz [1, 2, 3, 4], ¿cómo la representaría en JSON? Podría representarlo como:

{ 0: 1, 
    1: 2, 
    2: 3, 
    3: 4, 
    name: "myArray" 
}; 

Pero lo que tiene ahora ya no es una matriz. Además, el objeto de matriz en sí tiene un montón de propiedades nativas. ¿Cómo debería manejar un serializador JSON?

Creo que está mezclando una matriz como un objeto y una matriz como un literal. Una matriz como literal es solo [1, 2, 3, 4]. Ahora internamente, la matriz como objeto presumiblemente tiene alguna propiedad que apunta al valor real de la matriz. También tiene otras propiedades (como length) y métodos que actúan en consecuencia (como slice).

El serializador JSON está preocupado con el valor del objeto. Si x es una matriz, entonces la cosa que se debe serializar es el valor de x, que es [1, 2, 3, 4]. Las propiedades de x son completamente diferentes.

Si desea serializar estas propiedades adicionales, entonces deberá escribir su propio serializador que iterará sobre las propiedades de la matriz y representará todo en una matriz de mapa/asociativa. Esta es la única manera; la advertencia, como mencioné antes, es que ya no tienes una matriz real.

+0

advertencia de Pedantería: es solo un objeto. El objeto literal es el medio por el cual lo creó. –

+0

@Tim lo arreglará. Lo siento, tengo mis términos mezclados! –

+1

matriz se puede enriquecer con propiedades. en algunas situaciones, esto es muy beneficioso. No tiene sentido decir las situaciones. Digamos que no son la norma. No obstante, me doy cuenta de que las matrices enriquecidas no son json-able, lo que en mi opinión es una pena. – chacko

0

El problema es json2 todavía cree que es una matriz ya que x instanceof Array devuelve verdadero. Para solucionarlo, se podría crear la "matriz" de una manera indirecta:

var x = { 
    0: 1, 
    1: 2, 
    2: 3, 
    3: 4, 
    length: 4, 
    name: 'myArray' 
}; 

El problema de esta solución es que ninguno de los métodos de matriz estará disponible en el objeto. Entonces, si alguna vez necesitas usar pop, push, etc, tendrás que convertirlo a una matriz real con Array.prototype.slice.call(x); o si tienes hambre [].slice.call(x);.

0

No sé por qué lo haría, pero en el bucle podría conseguir todo

var x = [1,2,3]; 
x.name = "wtf"; 
for(var y in x){ 
    console.log(y + ":\t" + x[y]); 
} 

Produce:

0: 1 
1: 2 
2: 3 
name: wtf 

pero json2 código no verlo de esta manera, ¿por qué no lo hacen lo conviertes en un objeto?

+0

porque la matriz enriquecida se me pasa y necesito persistir. Creo que podría convertirlo antes de persistir y deserializarlo. – chacko