code: function serialize(obj, opts, prefix) {
    var str = []
      , useArraySyntax = false
  
    // if there's a prefix, and this object is an array, use array syntax
    // i.e., `prefix[]=foo&prefix[]=bar` instead of `prefix[0]=foo&prefix[1]=bar`
    if (Array.isArray(obj) && prefix) {
      useArraySyntax = true
    }
  
    Object.keys(obj).forEach(function (prop) {
      var key, query, val = obj[prop]
  
      key = prefix ?
        prefix + '[' + (useArraySyntax ? '' : prop) + ']' :
        prop
  
      if (val === null) {
        if (opts.removeNull) {
          return
        }
        query = opts.encodeComponents ? encodeURIComponent(key) : key
      } else if (typeof val === 'object') {
        query = serialize(val, opts, key)
      } else {
        query = opts.encodeComponents ?
          encodeURIComponent(key) + '=' + encodeURIComponent(val) :
          key + '=' + val;
      }
      str.push(query)
    })
  
    return str.join('&')
  }
docs: serialize an object recursively