5
votes

Comment convertir un objet JavaScript en chaîne LITERAL?

Si j'ai l'objet littéral:

'{"a": "hello"}'

Existe-t-il une fonction Javascript pour convertir cet objet en une chaîne littérale, de sorte que la sortie soit la syntaxe littérale:

XXX

Avec JSON.stringify la sortie serait

'{a: "hello"}'


7 commentaires

Un problème est qu'une fois que l'objet existe, il n'est pas possible de savoir comment les noms de propriété de type identificateur ont été exprimés lors de la création de l'objet (ou des propriétés ultérieures ajoutées). Ils peuvent avoir ou non des citations.


Vous ne savez pas quel est votre objectif, mais vous pourriez (mal) utiliser JSON.stringify () ...


Peut-être que cela peut aider stackoverflow.com/a/5612876/3565132


Pour être clair, cependant, {"a": "hello"} est une représentation d'objet littérale légale, donc je ne sais pas pourquoi la représentation JSON n'est pas suffisante pour votre objectif.


Pourquoi en avez-vous besoin? Si nous connaissons votre cas d'utilisation, nous pourrons peut-être suggérer une solution de contournement appropriée.


Merci les gars, mon cas d'utilisation est que je peux envoyer une requête de mutation au serveur et il n'accepte que: {a: "hello"} Et il n'accepte pas JSON: {"a": "hello"} Donc j'ai pensé que comme un contourner je devrais convertir mon objet en une chaîne littérale


Réparer le serveur pour qu'il prenne en charge JSON au lieu d'un format de données non standard serait un meilleur pari.


4 Réponses :


3
votes

JavaScript n'a pas de fonctions intégrées qui convertiront un objet en une représentation sous forme de chaîne de celui-ci qui soit:

  • Utilise des identifiants au lieu de chaînes pour les noms de propriété
  • Représente la syntaxe d'origine utilisée pour créer l'objet

Vous pouvez écrire votre propre fonction pour la première (au moins lorsque le nom de la propriété peut être représenté comme un littéral) mais la seconde est impossible car JavaScript ne stocke aucune information sur le code source utilisé pour créer l'objet en premier lieu.


1 commentaires

Merci beaucoup mon pote



0
votes

Il le convertit en syntaxe littérale. Vous êtes capable de créer des objets avec plusieurs formes de syntaxe. Les deux déclarations d'objet suivantes sont valides:

function reformat(str) {
    var myRegexp = /\"(.*?)\":/g;
    match = myRegexp.exec(str);
    while (match != null) {
        str = str.replace(match[0], match[1] + ":");
        match = myRegexp.exec(str);
    }

    return str;
}

Si vous souhaitez supprimer le "" autour de la clé, vous devriez pouvoir les faire correspondre avec l'expression régulière suivante /\"(.*?) \ ": / g et remplacez-les par quelque chose comme ceci:

var a = {a: "a"}
var b = {"b": "b"}

J'espère que cela aide :)


1 commentaires

Merci beaucoup mon pote



0
votes

Ok, juste pour le plaisir ... rouler le vôtre?

const stringify = (obj) => {
    // Iterate over keys, reducing to a string
    let str = Object.keys(obj).reduce((acc, cur) => {
        let next = `${cur}: "${obj[cur]}"`;
        return acc
            ? `${acc}, ${next}`
            : `{${next}`;
    }, '');
    
    // Return, appending final '}'
    return `${str}}`;
}

document.write(stringify({
    foo:1,
    bar:'seat'
}));

Cela dit, vos exigences exactes ne sont pas claires, donc je ne suis pas sûr que cela les satisfasse. Mais cela pourrait être un point de départ s'il n'y a pas de solution native qui fonctionne.


1 commentaires

@jonaswilms il pourrait facilement être modifié pour prendre en charge les objets et les tableaux imbriqués. Comme les exigences n'étaient pas complètes, j'ai fourni, comme mentionné, un point de départ qui démontre un concept.



2
votes

Vous pouvez le faire avec JSON.stringify puis avec String.replace comme suit:

var jsObj =
{
    abc: "hello",
    bca: "allo",
    cab: "dd:cc",
    d: ["hello", "llo", "dd:cc"],
    e: {abc: "hello", bca: "allo", cab: "dd:cc"}
};

function format(obj)
{
    var str = JSON.stringify(obj, 0, 4),
        arr = str.match(/".*?":/g);

    for(var i = 0; i < arr.length; i++)
        str = str.replace(arr[i], arr[i].replace(/"/g,''));

    return str;
}

console.log(format(jsObj));


3 commentaires

Merci Brahata, il m'a fallu un peu de temps pour vérifier les réponses mais j'apprécie vos efforts et cela m'a beaucoup aidé. En fin de compte, je comprends que je ne devrais pas transmettre des objets JSON au serveur comme ça car il est sujet aux bogues, mais j'ai appris à faire des manipulations sur une chaîne à partir de vos réponses et d'autres. Merci!


@ sir-haver, merci pour votre réponse! Vous pouvez trouver sur mon site de compte beaucoup de bonnes réponses. Et voici la liste de mes réponses notamment en JavaScript.


cela a parfaitement fonctionné lors de l'envoi des champs de formulaire de React au backend avec Graphql :)