如何在 Javascript 中创建查询参数?

IT技术 javascript url urlencode
2021-01-12 18:32:19

有什么方法可以创建用于在 JavaScript 中执行GET 请求查询参数

就像在 Python 中一样urllib.urlencode(),它接受一个字典(或两个元组的列表)并创建一个像'var1=value1&var2=value2'.

6个回答

干得好:

function encodeQueryData(data) {
   const ret = [];
   for (let d in data)
     ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
   return ret.join('&');
}

用法:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);
2021-03-14 18:32:19
投反对票,因为我不知道此解决方案是否符合规范并且始终有效。更喜欢现在可用的标准 URLSearchParams。OP 请考虑撤回这个过时的答案。
2021-03-15 18:32:19
@Shog9 为什么这是一个坏主意?
2021-03-19 18:32:19
@troelskn,好点子...虽然在这种情况下,有人必须扩展 Object.prototype 来破坏它,这是一个非常糟糕的主意。
2021-04-01 18:32:19
使用 迭代时for,使用hasOwnProperty来确保互操作性。
2021-04-05 18:32:19

URLSearchParams有越来越多的浏览器支持。

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = new URLSearchParams(data);

// searchParams.toString() === 'var1=value1&var2=value2'

Node.js 提供了查询字符串module。

const querystring = require('querystring');

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'
URLSearchParams 会将空白解析为“+”而不是“%20”。例如,new URLSearchParams({ abc: 'a b c' }).toString()导致'abc=a+b+c'
2021-03-15 18:32:19
2021 年怎么没有更标准化的方法来实现这一目标?例如,?仅在searchParams不为空添加怎么办
2021-03-18 18:32:19
绝对是干净和现代的方法。您也可以稍后自由调用searchParams.append(otherData)
2021-04-09 18:32:19

功能性的

function encodeData(data) {
    return Object.keys(data).map(function(key) {
        return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
}   
var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?应该生产https://www.something.com/?bloop1=true&bloop2=something
2021-03-14 18:32:19
@DylanHunt:是的……
2021-03-21 18:32:19
这是不够的。encodeData({foo:{bar:123}})返回foo=%5Bobject%20Object%5D,但正确的返回值是foo%5Bbar%5D=123
2021-03-30 18:32:19
好东西!.map() 已经在 J​​avaScript 1.6 中实现,所以几乎所有浏览器,甚至老奶奶都支持它。但是你可以猜到 IE 除了 IE 9+ 之外没有。不过别担心,有一个解决方法。来源:developer.mozilla.org/en-US/docs/JavaScript/Reference/...
2021-04-09 18:32:19

Zabba在对当前接受的答案的评论中提供了一个建议,对我来说是最好的解决方案:使用jQuery.param()

如果我使用jQuery.param()原始问题中的数据,那么代码很简单:

const params = jQuery.param({
    var1: 'value',
    var2: 'value'
});

变量params将是

"var1=value&var2=value"

有关更复杂的示例、输入和输出,请参阅jQuery.param()文档。

ES2017 (ES8)

利用Object.entries(),它返回一个对象[key, value]的数组例如,因为{a: 1, b: 2}它会返回[['a', 1], ['b', 2]]. 仅 IE 不支持(也不会)。

代码:

const buildURLQuery = obj =>
      Object.entries(obj)
            .map(pair => pair.map(encodeURIComponent).join('='))
            .join('&');

例子:

buildURLQuery({name: 'John', gender: 'male'});

结果:

"name=John&gender=male"