2011-10-05 6 views
5

J'utilise un objet comme table de hachage. Je voudrais imprimer rapidement son contenu (pour alert() par exemple). Y a-t-il quelque chose de construit pour convertir un hachage en tableaux de paires (clé, valeur)?Aplatir l'objet dans le tableau?

+0

quel est le problème avec 'console.log' ou' console.dir'? – jAndy

+0

Quel est le problème avec la console.bûche()? Pourquoi alerte? Il ne montre jamais assez d'informations de débogage. Les consoles des nouveaux navigateurs devraient afficher suffisamment d'informations si vous conservez votre variable. De plus, les tableaux JS sont des objets .. ou si vous voulez, les objets sont des tableaux associatifs. –

+0

@ N.B .: JS 'Array's sont' Object's; et JS 'Object's modélisent le concept de" tableaux associatifs ", mais" tableaux associatifs "et" Array "sont des notions distinctes. Ne les confondons pas! La terminologie de l'OP est sur place. –

Répondre

2

Je mis à jour ce peu plus. C'est beaucoup plus facile à analyser que même console.log, car il laisse de côté les choses supplémentaires comme __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 
    } 
} 

La seule chose que je ferais pour améliorer cela est de le mettre en retrait correctement en fonction du niveau de récursivité.

+0

Pourquoi choisiriez-vous ceci sur 'console.log'? Pourquoi évitez-vous les options de débogage fantastique que votre navigateur vous fournit? –

+2

Qui a dit que quelqu'un évitait 'console.log'? La question était de savoir comment aplatir les données. 'alert()' n'a été mentionné que "par exemple". Et s'il veut le renvoyer à un serveur via Ajax pour y être connecté? –

+0

Je suis conscient de 'console.log' et il est certainement parfait pour la plupart de mes besoins de débogage. Cependant parfois, je trouve utile d'utiliser l'alerte pour savoir exactement quand quelque chose se passe. Le code qui vient directement après une alerte n'est pas exécuté tant que vous n'avez pas activé l'alerte. Généralement, lorsque ce comportement n'est pas souhaité, il y a peu de raison d'utiliser 'alert()'. –

0

Utilisez la boucle:

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

de cette façon, vous ne verriez que les valeurs. Bute même si vous concentresz les clés aussi, il alerterait plusieurs fois probablement. Vous devez créer une chaîne et alerter la sortie finale. – jAndy

+0

bien ceci est juste un exemple de la boucle for, pas une implémentation complète de ce que l'op veut. il devrait être capable de comprendre le reste. – m0sa

1

Non pas que je suis au courant. Pourtant, vous pouvez le faire vous-même assez lapidaire:

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 }] 

Bien sûr, vous ne pouvez pas non plus alert, vous pourriez tout aussi bien console.log(obj) en premier lieu.


Vous pourrait tableaux de sortie de tableaux:

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 

Mais, encore une fois, ew.

6

Puisque vous voulez alert je suppose que ce n'est pas pour votre version de production, et cette ancienne compatibilité de navigateur n'est pas un problème.

Si tel est le cas, alors vous pouvez le faire:

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

C'est assez mignon. –

+0

Oh, oui il est: 'var myUsers = {};' ' myUsers [0] = { 'id': 'x', 'nom d'utilisateur': 'aaa'} \' n' myUsers [1 ] = {'id': 'y', 'nom d'utilisateur': 'bbb'} ' ' Object.keys (myUsers) .map (fonction (touche) {return myUsers [clé] .username;}) ' Merci ! – dirkk0

1

pour & rapide salissante dans alert vous pouvez utiliser JSON:

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

Voici ma version. Il devrait vous permettre d'aplatir entrée comme ci-dessous:

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

La fonction est comme ceci:

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

L'utilisation est quelque chose comme:

sortie var = []

aplatissent (entrée sortie);

La sortie doit alors être la matrice aplatie.

0

Peut-être un peu en retard, mais ici vous avez ma version de la réponse, mise à jour à ES2015. J'utilise une fonction récursive et il fonctionne même s'il y a d'autres objets à l'intérieur de l'objet principal:

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] }`; 
    })); 
} 

changer Ainsi, le dernier retour, vous pouvez formater l'élément dans votre tableau.