2012-05-18 2 views
12

Sto provando a farlo ora e mi chiedo se esiste un metodo "il più usato" per unire un array associativo (i suoi valori) in una stringa, delimitata da un carattere.Come unire un array associativo in una stringa

Per esempio, ho

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

La stringa risultato di unire gli elementi di questo oggetto sarà

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

se li uniamo con un "" carattere Qualche idea? Grazie!

+1

Non esiste un metodo predefinito per farlo; basta scrivere un breve pezzo di codice. Essere consapevoli del fatto che l'ordine delle proprietà, come restituito da una 'ciclo FOR ... tale dicitura non sarà prevedibile, quindi se si vuole imporre qualche modo canonico di ordinare i valori si dovrà pensare a qualcosa di te stesso. – Pointy

risposta

9

Basta scorrere l'array. Qualsiasi array in JavaScript ha indici, array associativi anche:

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)); 

stamperà: 0, false, apple

+1

'i in AssocArray' dovrebbe essere 'var i in AssocArray' in modo che non inquini lo spazio dei nomi globale. – pseudosavant

+0

Verissimo, il tipo di cosa che non ho preso in considerazione in questo esempio. – Hidde

+0

Forse dovresti aggiungere un controllo usando 'hasOwnProperty' come questo: 'for (var i in AssocArray) { ** if (AssocArray hasOwnProperty (i)) ** s + = AssocArray [i] +", "; } ' See: 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(','); 

PS: c'è Object.values metodo da qualche parte, ma non è uno standard. E ci sono anche librerie esterne come hashish.

+2

mi piace molto battute, ma si deve tenere a mente due cose: non funziona per IE <9, e l'utilizzo di 'map' può essere lento per oggetto molto grande. – MaxArt

+1

1) funziona per IE <9 con librerie di compatibilità; 2) concatenazione di stringhe è troppo lento ... così per davvero oggetti di grandi dimensioni è necessario utilizzare un altro approccio completamente come ruscelli nel node.js (ma in realtà, questo non è in questione) – alex

+1

Ali mai detto nulla su come utilizzare le altre librerie, ma in ogni caso chiamare le funzioni è molto più lento della concatenazione di stringhe e anche se non vuoi concatenare le stringhe puoi sempre usare gli array temporanei e usare 'join' alla fine. – MaxArt

5

l'implementazione di funzioni come Object.map, Object.forEach e così via viene ancora discusso. Per ora, si può attaccare con qualcosa di simile:

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

Edit: utilizzando un array temporaneo e unirsi invece di concatenazione di stringhe per il miglioramento delle prestazioni.

Edit 2: sembra che arr.push(obj[p]); invece di incrementare un contatore può effettivamente essere più veloce nella maggior parte dei recenti browser. Vedi i commenti.

+0

c'è una ragione per cui non sono solo utilizzando 'arr.push (obj [p])' invece di 'arr [i ++] = obj [p]'? – pseudosavant

+0

Questo perché anche se 'push' è una funzione molto veloce, è comunque una funzione, e chiamare una funzione è costoso.Al giorno d'oggi molti browser hanno un'ottimizzazione speciale, ma non è sempre così. Un'altra tecnica consiste nel dimensionare l'array prima di assegnare i suoi elementi con 'new Array (lentgh)', per evitare di ridimensionarlo, ma può essere fatto solo se si conosce 'length', e questo non è il caso. – MaxArt

+1

Sembra un'ottimizzazione prematura. Sembra che le prestazioni tra questi due metodi varino molto, e il modo migliore dipende dal browser utilizzato. Guarda questo esempio di jsperf: http://jsperf.com/array-increment-vs-array-push – pseudosavant