2012-05-18 12 views
12

Estoy tratando de hacer esto ahora y me pregunto si existe un método "el más utilizado" para unir una matriz asociativa (sus valores) en una cadena, delimitada por un carácter.Cómo unir una matriz asociativa a una cadena

Por ejemplo, he

var AssocArray = { id:0, status:false, text:'apple' }; 

La cadena resultado de unir los elementos de este objeto será

"0, false, 'apple'" or "0, 0, 'apple'" 

si los unimos con un carácter "" Alguna idea? ¡Gracias!

+1

No hay un método incorporado para hacerlo; solo escribe un pequeño fragmento de código. Tenga en cuenta que el orden de las propiedades devuelto por un bucle 'for ... in' no será predecible, por lo que si desea imponer alguna forma canónica de ordenar los valores, tendrá que pensar en algo usted mismo. – Pointy

Respuesta

9

Simplemente recorra la matriz. Cualquier matriz en JavaScript tiene índices, matrices asociativas: incluso

var AssocArray = { id:0, status:false, text:'apple' }; 
    var s = ""; 
    for (var i in AssocArray) { 
     s += AssocArray[i] + ", "; 
    } 
    document.write(s.substring(0, s.length-2)); 

la salida: 0, false, apple

+1

'i en AssocArray' debe ser 'var i en AssocArray' para que no contamine el espacio de nombres global. – pseudosavant

+0

Muy cierto, el tipo de cosas que no tomé en cuenta en este ejemplo. – Hidde

+0

Tal vez debería agregar un cheque usando 'hasOwnProperty' de la siguiente manera: 'para (var i en AssocArray) { ** if (AssocArray hasOwnProperty (i)) ** s + = AssocArray [i] +", "; } ' Ver: http://stackoverflow.com/questions/921789/how-to-loop-through-plain-javascript-object-with-objects-as-members –

17
Object.keys(AssocArray).map(function(x){return AssocArray[x];}).join(','); 

PD: hay Object.values método en alguna parte, pero no es una norma. Y también hay bibliotecas externas como hashish.

+2

Me gustan mucho las frases sencillas, pero debes tener en cuenta dos cosas: no funciona para IE <9, y usar 'map' puede ser lento para objetos muy grandes. – MaxArt

+1

1) funciona para IE <9 con bibliotecas de compatibilidad; 2) la concatenación de cadenas también es lenta ... así que para objetos realmente grandes tienes que usar completamente otro enfoque como streams en node.js (pero en realidad, eso no está en la pregunta) – alex

+1

nunca he dicho nada sobre el uso de otras bibliotecas, pero de todos modos Llamar a las funciones es mucho más lento que la concatenación de cadenas, e incluso si no desea concatenar cadenas, siempre puede usar matrices temporales y usar 'join' al final. – MaxArt

5

La implementación de funciones como Object.map, Object.forEach y así sucesivamente Todavía se está discutiendo. Por ahora, puede seguir con algo como esto:

function objectJoin(obj, sep) { 
    var arr = [], p, i = 0; 
    for (p in obj) 
     arr[i++] = obj[p]; 
    return arr.join(sep); 
} 

Editar: el uso de una matriz temporal y unirse a ella en lugar de la concatenación de cadenas para la mejora del rendimiento.

Editar 2: Parece que arr.push(obj[p]); en lugar de aumentar un contador en realidad puede ser más rápido en la mayoría de los navegadores recientes. Ver comentarios.

+0

¿Hay alguna razón por la que no solo esté utilizando 'arr.push (obj [p])' en lugar de 'arr [i ++] = obj [p]'? – pseudosavant

+0

Eso es porque incluso si 'push' es una función muy rápida, no obstante es una función, y llamar a una función es muy costoso.Muchos navegadores tienen una optimización especial para él hoy en día, pero ese no es siempre el caso. Otra técnica consiste en dimensionar la matriz antes de asignar sus elementos con 'new Array (lentgh)', para evitar su redimensionamiento, pero solo se puede hacer si se conoce 'length', y este no es el caso. – MaxArt

+1

Parece una optimización prematura. Parece que el rendimiento entre estos dos métodos varía mucho, y la "mejor" forma depende del navegador utilizado. Mira este ejemplo de jsperf: http://jsperf.com/array-increment-vs-array-push – pseudosavant

Cuestiones relacionadas