有没有简单的方法可以将复杂的JS对象转换为查询参数?

时间:2019-06-24 13:25:27

标签: javascript arrays query-parameters

我有一个带有嵌套数组的JS对象,以这个为例:

{
   array: [
    {
        name: 'test-1'
    },
    {
        name: 'test-2'
    }
   ]
   simpleParam: 1,
   complexParam: {
    attribute: 2
   }
}

我需要将其转换为查询参数,因为我正在使用的API需要以以下格式读取它们:

“ array [0] .name ='test-1'&array [1] .name ='test-2'&simpleParam = 1&complexParam.attribute = 2”

我想知道是否有像JSON.stringify()这样的简单方法可以满足我的需要,或者我是否需要编写自己的通用算法来进行这种转换。 / p>

编辑 我想使用普通的JS,请务必注意,我要格式化的对象中有数组

2 个答案:

答案 0 :(得分:1)

这是我写的class的另一篇文章:

var data = {
  array: [{
      name: 'test-1'
    },
    {
      name: 'test-2'
    }
  ],
  simpleParam: 1,
  complexParam: {
    attribute: 2
  }
};

var urlstring = stringifyObject(data);

console.log(urlstring);
console.log(decodeURIComponent(urlstring));

/**
 * Provided an object, it will convert it to a query string
 * @param data object to convert
 * @returns query string
 */
function stringifyObject(data) {
  var value, key, tmp = [];
  const encodeFunc = data => encodeURIComponent('' + data).replace(/!/g, '%21')
    .replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29')
    .replace(/\*/g, '%2A').replace(/%20/g, '+');
  const _hbqHelper = (key, val) => {
    var k, tmp = [];
    if (val === true) val = '1';
    else if (val === false) val = '0';
    if (val !== null) {
      if (typeof val === 'object') {
        for (k in val)
          if (val[k] !== null)
            tmp.push(_hbqHelper(key + '[' + k + ']', val[k], '&'));
        return tmp.join('&');
      } else if (typeof val !== 'function') return encodeFunc(key) + '=' + encodeFunc(val);
      else return false;
    } else return '';
  };
  for (key in data) {
    value = data[key];
    var query = _hbqHelper(key, value, '&');
    if (query === false) continue;
    if (query !== '') tmp.push(query)
  }
  return tmp.join('&');
}

答案 1 :(得分:0)

您可以使用/foojQuery.param()来做到这一点,希望输出是您想要的。

decodeURI()