Query-string encoding of a Javascript Object

前端 未结 30 2910
渐次进展
渐次进展 2020-11-22 00:23

Do you know a fast and simple way to encode a Javascript Object into a string that I can pass via a GET Request?

No jQuery, no

相关标签:
30条回答
  • 2020-11-22 00:56

    Single line to convert Object into Query String in case somebody need it again

    let Objs = { a: 'obejct-a', b: 'object-b' }
    
    Object.keys(objs).map(key => key + '=' + objs[key]).join('&')
    
    // result will be a=object-a&b=object-b
    
    0 讨论(0)
  • 2020-11-22 00:56

    I've written a package just for that: object-query-string :)

    Supports nested objects, arrays, custom encoding functions etc. Lightweight & jQuery free.

    // TypeScript
    import { queryString } from 'object-query-string';
    
    // Node.js
    const { queryString } = require("object-query-string");
    
    const query = queryString({
        filter: {
            brands: ["Audi"],
            models: ["A4", "A6", "A8"],
            accidentFree: true
        },
        sort: 'mileage'
    });
    
    

    returns

    filter[brands][]=Audi&filter[models][]=A4&filter[models][]=A6&filter[models][]=A8&filter[accidentFree]=true&sort=milage
    
    0 讨论(0)
  • 2020-11-22 00:56

    Refer from the answer @user187291, add "isArray" as parameter to make the json nested array to be converted.

    data : {
                        staffId : "00000001",
                        Detail : [ {
                            "identityId" : "123456"
                        }, {
                            "identityId" : "654321"
                        } ],
    
                    }
    

    To make the result :

    staffId=00000001&Detail[0].identityId=123456&Detail[1].identityId=654321

    serialize = function(obj, prefix, isArray) {
            var str = [],p = 0;
            for (p in obj) {
                if (obj.hasOwnProperty(p)) {
                    var k, v;
                    if (isArray)
                        k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
                    else
                        k = prefix ? prefix + "." + p + "" : p, v = obj[p];
    
                    if (v !== null && typeof v === "object") {
                        if (Array.isArray(v)) {
                            serialize(v, k, true);
                        } else {
                            serialize(v, k, false);
                        }
                    } else {
                        var query = k + "=" + v;
                        str.push(query);
                    }
                }
            }
            return str.join("&");
        };
    
        serialize(data, "prefix", false);
    
    0 讨论(0)
  • 2020-11-22 00:57
    Object.keys(obj).reduce(function(a,k){a.push(k+'='+encodeURIComponent(obj[k]));return a},[]).join('&')
    

    Edit: I like this one-liner, but I bet it would be a more popular answer if it matched the accepted answer semantically:

    function serialize( obj ) {
        let str = '?' + Object.keys(obj).reduce(function(a, k){
            a.push(k + '=' + encodeURIComponent(obj[k]));
            return a;
        }, []).join('&');
        return str;
    }
    
    0 讨论(0)
  • 2020-11-22 00:57

    A small amendment to the accepted solution by user187291:

    serialize = function(obj) {
       var str = [];
       for(var p in obj){
           if (obj.hasOwnProperty(p)) {
               str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
           }
       }
       return str.join("&");
    }
    

    Checking for hasOwnProperty on the object makes JSLint/JSHint happy, and it prevents accidentally serializing methods of the object or other stuff if the object is anything but a simple dictionary. See the paragraph on for statements in this page: http://javascript.crockford.com/code.html

    0 讨论(0)
  • 2020-11-22 00:57

    Rails / PHP Style Query Builder

    This method converts a Javascript object into a URI Query String. Also handles nested arrays and objects (in Rails / PHP syntax):

    function serializeQuery(params, prefix) {
      const query = Object.keys(params).map((key) => {
        const value  = params[key];
    
        if (params.constructor === Array)
          key = `${prefix}[]`;
        else if (params.constructor === Object)
          key = (prefix ? `${prefix}[${key}]` : key);
    
        if (typeof value === 'object')
          return serializeQuery(value, key);
        else
          return `${key}=${encodeURIComponent(value)}`;
      });
    
      return [].concat.apply([], query).join('&');
    }
    

    Example Usage:

    let params = {
      a: 100,
      b: 'has spaces',
      c: [1, 2, 3],
      d: { x: 9, y: 8}
    }
    
    serializeQuery(params)
    // returns 'a=100&b=has%20spaces&c[]=1&c[]=2&c[]=3&d[x]=9&d[y]=8
    
    0 讨论(0)
提交回复
热议问题