199 votes

Comment sérialiser un objet dans une liste de paramètres?

Sans connaître les clés d'un JavaScript Object , comment puis-je transformer quelque chose comme ...

 var obj = {
   param1: 'something',
   param2: 'somethingelse',
   param3: 'another'
}

obj[param4] = 'yetanother';
 

...dans...

 var str = 'param1=something&param2=somethingelse&param3=another&param4=yetanother';
 

...?

146voto

Duke Points 2752

Vous pouvez facilement utiliser la même méthode que jQuery utilise pour paramétrer les paramètres d’une requête ajax GET dans une chaîne d’URL:

 $.param( obj )
 

http://api.jquery.com/jQuery.param/

137voto

benweet Points 726

Un élégant: (en supposant que vous utilisez un navigateur moderne ou un nœud)

 var str = Object.keys(obj).map(function(key) {
    return key + '=' + obj[key];
}).join('&');
 

119voto

aroth Points 28424
 var str = "";
for (var key in obj) {
    if (str != "") {
        str += "&";
    }
    str += key + "=" + obj[key];
}
 

Exemple: http://jsfiddle.net/WFPen/

20voto

alex Points 186293

Pour un niveau de profondeur...

var serialiseObject = function(obj) {
    var pairs = [];
    for (var prop in obj) {
        if (!obj.hasOwnProperty(prop)) {
            continue;
        }
        pairs.push(prop + '=' + obj[prop]);
    }
    return pairs.join('&');
}

jsFiddle.

Il y avait parler d'une fonction récursive pour arbitrairement profonde des objets...

var serialiseObject = function(obj) {
    var pairs = [];
    for (var prop in obj) {
        if (!obj.hasOwnProperty(prop)) {
            continue;
        }
        if (Object.prototype.toString.call(obj[prop]) == '[object Object]') {
            pairs.push(serialiseObject(obj[prop]));
            continue;
        }
        pairs.push(prop + '=' + obj[prop]);
    }
    return pairs.join('&');
}

jsFiddle.

Bien sûr, cela signifie que l'imbrication contexte est perdu dans la sérialisation.

Si les valeurs ne sont pas codées dans l'URL pour commencer, et vous avez l'intention de les utiliser dans une URL, découvrez JavaScript encodeURIComponent().

5voto

Jared Farrish Points 26391

Depuis que j'ai fait une grosse affaire sur une fonction récursive, voici ma propre version.

 function objectParametize(obj, delimeter, q) {
    var str = new Array();
    if (!delimeter) delimeter = '&';
    for (var key in obj) {
        switch (typeof obj[key]) {
            case 'string':
            case 'number':
                str[str.length] = key + '=' + obj[key];
            break;
            case 'object':
                str[str.length] = objectParametize(obj[key], delimeter);
        }
    }
    return (q === true ? '?' : '') + str.join(delimeter);
}
 

http://jsfiddle.net/userdude/Kk3Lz/2/

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