1106 votes

Conversion d'un objet en chaîne de caractères

Comment convertir un objet JavaScript en une chaîne de caractères ?

Exemple :

var o = {a:1, b:2}
console.log(o)
console.log('Item: ' + o)

Sortie :

Objet { a=1, b=2} // très belle sortie lisible :)
Objet : [objet Objet] // aucune idée de ce qu'il y a dedans :(

7 votes

Convertir en chaîne de caractères dans quel but ? Vous voulez dire sérialiser pour pouvoir construire l'objet plus tard à partir de la chaîne ? Ou juste pour l'affichage ?

20 votes

L'auteur est parti depuis des années, mais en lisant en tête, après des années, je suppose que le point d'entrée du problème était la console.log(obj), qui affiche l'objet avec des propriétés, alors que console.log('obj : '+obj) fonctionne de manière désorientée autrement.

2 votes

Si nous pouvions le faire, il n'y aurait pas de différence entre le type de valeur et le type de référence.

1510voto

Gary Chambers Points 6465

Je recommande d'utiliser JSON.stringify qui convertit l'ensemble des variables de l'objet en une chaîne JSON. La plupart des navigateurs modernes prennent en charge cette méthode en mode natif, mais pour ceux qui ne le font pas, vous pouvez inclure une balise Version JS :

var obj = {
  name: 'myObj'
};

JSON.stringify(obj);

7 votes

Pour mémoire, IE6 et 7 ne prennent pas en charge cette fonction. IE6 n'est pas un problème majeur car il compte très peu d'utilisateurs et fait l'objet d'une campagne active visant à le supprimer... mais il y a encore un certain nombre d'utilisateurs d'IE7 (cela dépend de votre base d'utilisateurs).

35 votes

J'obtiens un "Uncaught TypeError : Convertir une structure circulaire en JSON". Même s'il y a une référence circulaire, j'aimerais quand même voir une représentation en chaîne de mon objet. Que puis-je faire ?

0 votes

Le lien "version JS" est cassé, en voici un qui fonctionne et sur sa page d'accueil .

101voto

Brett Zamir Points 5355

Bien sûr, pour convertir un objet en chaîne de caractères, vous devez soit utiliser votre propre méthode, telle que :

function objToString (obj) {
    var str = '';
    for (var p in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, p)) {
            str += p + '::' + obj[p] + '\n';
        }
    }
    return str;
}

En fait, ce qui précède ne montre que l'approche générale ; vous pouvez utiliser quelque chose comme http://phpjs.org/functions/var_export:578 ou http://phpjs.org/functions/var_dump:604

ou, si vous n'utilisez pas de méthodes (fonctions en tant que propriétés de votre objet), vous pouvez peut-être utiliser le nouveau standard (mais non implémenté dans les anciens navigateurs, bien que vous puissiez trouver un utilitaire pour les aider aussi), JSON.stringify(). Mais là encore, cela ne fonctionnera pas si l'objet utilise des fonctions ou d'autres propriétés qui ne sont pas sérialisables en JSON.

Mise à jour :

Une solution plus moderne serait :

function objToString (obj) {
    let str = '';
    for (const [p, val] of Object.entries(obj)) {
        str += `${p}::${val}\n`;
    }
    return str;
}

ou :

function objToString (obj) {
    return Object.entries(obj).reduce((str, [p, val]) => {
        return `${str}${p}::${val}\n`;
    }, '');
}

39voto

Gazler Points 23588

EDIT N'utilisez pas cette réponse car elle ne fonctionne que dans certaines versions de Firefox. Aucun autre navigateur ne la prend en charge. Utilisez Gary Chambers solution.

toSource() est la fonction que vous recherchez pour l'écrire en JSON.

var object = {};
object.first = "test";
object.second = "test2";
alert(object.toSource());

7 votes

Bien que ce soit pratique pour le débogage dans Firefox, toSource() ne fonctionne pas dans IE.

7 votes

toSource() n'est pas une norme reconnue et sa prise en charge par tous les navigateurs n'est donc pas garantie.

11 votes

Ahh, merci de l'avoir souligné. Je vais laisser ma réponse ici pour les autres qui ne le savent pas.

24voto

Houshalter Points 156

Aucune des solutions proposées ici n'a fonctionné pour moi. JSON.stringify semble être ce que beaucoup de gens disent, mais il supprime les fonctions et semble assez cassé pour certains objets et tableaux que j'ai essayé en le testant.

J'ai créé ma propre solution qui fonctionne dans Chrome au moins. Je la poste ici pour que toute personne qui cherche ce problème sur Google puisse la trouver.

//Make an object a string that evaluates to an equivalent object
//  Note that eval() seems tricky and sometimes you have to do
//  something like eval("a = " + yourString), then use the value
//  of a.
//
//  Also this leaves extra commas after everything, but JavaScript
//  ignores them.
function convertToText(obj) {
    //create an array that will later be joined into a string.
    var string = [];

    //is object
    //    Both arrays and objects seem to return "object"
    //    when typeof(obj) is applied to them. So instead
    //    I am checking to see if they have the property
    //    join, which normal objects don't have but
    //    arrays do.
    if (typeof(obj) == "object" && (obj.join == undefined)) {
        string.push("{");
        for (prop in obj) {
            string.push(prop, ": ", convertToText(obj[prop]), ",");
        };
        string.push("}");

    //is array
    } else if (typeof(obj) == "object" && !(obj.join == undefined)) {
        string.push("[")
        for(prop in obj) {
            string.push(convertToText(obj[prop]), ",");
        }
        string.push("]")

    //is function
    } else if (typeof(obj) == "function") {
        string.push(obj.toString())

    //all other values can be done with JSON.stringify
    } else {
        string.push(JSON.stringify(obj))
    }

    return string.join("")
}

EDIT : Je sais que ce code peut être amélioré mais je n'ai jamais eu le temps de le faire. L'utilisateur andrey a suggéré une amélioration ici avec le commentaire :

Voici un code un peu modifié, qui peut gérer 'null' et 'undefined', et qui n'ajoute pas de virgules excessives.

Utilisez cela à vos risques et périls car je ne l'ai pas du tout vérifié. N'hésitez pas à suggérer toute amélioration supplémentaire en commentaire.

0 votes

Il vous manque des "}".

2 votes

Très bon code, mais il y a une queue de poisson. , à la fin de chaque objet/réseau.

0 votes

C'est la meilleure réponse

18voto

Jake Drew Points 354

Dans les cas où vous savez que l'objet n'est qu'un booléen, une date, une chaîne, un nombre etc... La fonction javascript String() fonctionne très bien. Je l'ai récemment trouvée utile pour traiter les valeurs provenant de la fonction $.each de Jquery.

Par exemple, l'exemple suivant convertit tous les éléments de "valeur" en chaîne de caractères :

$.each(this, function (name, value) {
  alert(String(value));
});

Plus de détails ici :

http://www.w3schools.com/jsref/jsref_string.asp

0 votes

Ou var my_string = ''+value+'';

2 votes

Ça marche pour moi. Je préfère cette solution car je n'utiliserais pas un plugin pour une tâche aussi simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X