2011-10-05 14 views
5

Sto usando un oggetto come tabella hash. Mi piacerebbe stampare rapidamente i suoi contenuti (per alert() per esempio). C'è qualcosa di integrato per convertire un hash in matrici di coppie (chiave, valore)?Appiattisci oggetto su matrice?

+0

Cosa c'è di sbagliato in 'console.log' o' console.dir'? – jAndy

+0

Cosa c'è di sbagliato con la console.log()? Perché avvisare? Non mostra mai abbastanza informazioni di debug. Le console dei browser più recenti dovrebbero visualizzare informazioni sufficienti se console.log la tua variabile. Inoltre, gli array JS sono oggetti .. o se lo vorrai, gli oggetti sono array associativi. –

+0

@ N.B .: JS 'Array's sono' Object's; e JS 'Object's modella il concetto di" array associativi ", ma" array associativi "e' Array's sono nozioni distinte. Non confondiamoli! La terminologia dell'OP è azzeccata. –

risposta

2

ho aggiornato questo un po 'di più. Questo è molto più semplice da analizzare rispetto a console.log perché lascia fuori le cose extra che sono lì come __proto__.

function flatten(obj) { 
    var empty = true; 
    if (obj instanceof Array) { 
     str = '['; 
     empty = true; 
     for (var i=0;i<obj.length;i++) { 
      empty = false; 
      str += flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+']'; 
    } else if (obj instanceof Object) { 
     str = '{'; 
     empty = true; 
     for (i in obj) { 
      empty = false; 
      str += i+'->'+flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+'}'; 
    } else { 
     return obj; // not an obj, don't stringify me 
    } 
} 

L'unica cosa che vorrei fare per migliorare questo è l'hanno rientrare correttamente in base al livello di ricorsione.

+0

Perché dovresti scegliere questo su 'console.log'? Perché stai evitando le fantastiche opzioni di debug offerte dal tuo browser? –

+2

Chi ha detto che qualcuno stava evitando 'console.log'? La domanda era come appiattire i dati. 'alert()' è stato citato solo "per esempio". Cosa succede se vuole inviarlo a un server tramite Ajax per essere registrato lì? –

+0

Sono a conoscenza di 'console.log' ed è sicuramente ottimo per la maggior parte delle mie esigenze di debug. Tuttavia a volte trovo utile usare l'avviso per scoprire esattamente quando succede qualcosa. Il codice che arriva direttamente dopo un avviso non viene eseguito fino a quando non si avverte l'avviso. Generalmente quando questo comportamento non è desiderato ci sono pochi motivi per usare 'alert()'. –

0

Utilizzare il ciclo for:

for (var x in yourObj) 
{ 
    alert(yourObj[x]); 
} 
+0

in questo modo vedresti solo i valori. Buto anche se si concentenano anche i tasti, questo avverrebbe molte volte probabilmente. Dovresti creare una stringa e avvisare l'output finale. – jAndy

+0

beh questo è solo un esempio del ciclo for, non un'implementazione completa di ciò che l'op vuole. dovrebbe essere in grado di capire il resto. – m0sa

1

Non che io sappia. Ancora, si può fare da soli piuttosto conciso:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    var e = {}; 
    e[i] = obj[i]; 
    arr.push(e); 
} 
console.log(arr); 
// Output: [Object { a=1 }, Object { b=2 }, Object { c=3 }] 

Naturalmente, non si può alert questa operazione, così si potrebbe anche semplicemente console.log(obj) in primo luogo.


È potrebbe array di uscita di array:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    arr.push([i, obj[i]]); 
} 
console.log(arr); 
// Output: [["a", 1], ["b", 2], ["c", 3]] 

alert(arr); 
// Alert: a, 1, b, 2, c, 3 

Ma, ancora una volta, ew.

6

Dal momento che si desidera alert presumo che non è per la versione di produzione, e che la vecchia compatibilità del browser non è un problema.

Se questo è il caso, allora si può fare questo:

var myHash = ...... 
alert(Object.keys(myHash).map(function(key) { return [key, myHash[key]]; })); 
+0

Questo è piuttosto dolce. –

+0

Oh, sì, è: 'var myUsers = {};' ' myUsers [0] = { 'id': 'x', 'username': 'aaa'} \ n' ' myUsers [1 ] = {'id': 'y', 'username': 'bbb'} ' ' Object.keys (myUsers) .map (function (key) {return myUsers [key] .username;}) ' Grazie ! – dirkk0

1

per un rapido utilizzo & sporco in alert si potrebbe usare JSON:

alert(JSON.stringify(yourObj).replace(/,/g,'\n')); 
1

Qui è la mia versione di esso. Esso dovrebbe consentire di appiattire ingresso come di seguito:

var input = { 
    a: 'asdf', 
    b: [1,2,3], 
    c: [[1,2],[3,4]], 
    d: {subA: [1,2]} 
} 

La funzione è simile a questo:

function flatten (input, output) { 

     if (isArray(input)) { 
     for(var index = 0, length = input.length; index < length; index++){ 
      flatten(input[index], output); 
     } 
     } 
     else if (isObject(input)) { 
     for(var item in input){ 
      if(input.hasOwnProperty(item)){ 
      flatten(input[item], output); 
      } 
     } 
     } 
     else { 
     return output.push(input); 
     } 
    }; 

    function isArray(obj) { 
     return Array.isArray(obj) || obj.toString() === '[object Array]'; 
    } 

    function isObject(obj) { 
     return obj === Object(obj); 
    } 

Usage è qualcosa di simile:

uscita var = []

appiattire (input Output);

Quindi l'output deve essere l'array appiattito.

0

Forse un po 'in ritardo, ma qui avete la mia versione della risposta, aggiornata a ES2015. Io uso una funzione ricorsiva e funziona anche se ci sono altri oggetti all'interno dell'oggetto principale:

function objectFlattener (object) { 
    return Reflect.apply(Array.prototype.concat, [], Object.keys(object).map(key => { 
    if (object[key] instanceof Object) { 
     return objectFlattener(object[key]); 
    } 
    return `${ key }: ${ object[key] }`; 
    })); 
} 

Così modificato l'ultima di ritorno è possibile formattare l'elemento all'interno dell'array.

Problemi correlati