当前位置:  开发笔记 > 编程语言 > 正文

如何使用Javascript构建查询字符串

如何解决《如何使用Javascript构建查询字符串》经验,为你挑选了10个好方法。

只是想知道是否有任何内置的Javascript可以获取一个Form并返回查询参数,例如:"var1 = value&var2 = value2&arr [] = foo&arr [] = bar ..."

多年来我一直在想这个.



1> Artur Klesu..:

没有jQuery

var params = {
    parameter1: 'value_1',
    parameter2: 'value 2',
    parameter3: 'value&3' 
};

var esc = encodeURIComponent;
var query = Object.keys(params)
    .map(k => esc(k) + '=' + esc(params[k]))
    .join('&');

对于不支持需要ES5的箭头函数语法的浏览器,请将.map...行更改为

    .map(function(k) {return esc(k) + '=' + esc(params[k]);})


3)并非所有浏览器都支持箭头函数语法(需要ES5).如果你想支持所有的浏览器(并对部件进行编码),用.map替换上面的.map()(函数(k){return encodeURIComponent(k)+'='+ encodeURIComponent(params [k]);})
我见过的最佳解决方案 - 非常简洁明了.但有几点需要注意.1)在.map()中,k和params [k]都应该被编码,例如encodeURIComponent(k)和encodeURIComponent(params [k]).2)您可以在查询字符串中拥有多个命名参数实例.如果您需要该功能,则必须使用数组而不是对象(大多数应用程序不需要或不需要).
"不够jquery"

2> techouse..:

如果您正在使用jQuery,可能需要查看jQuery.param() http://api.jquery.com/jQuery.param/

例:

var params = {
    parameter1: 'value1',
    parameter2: 'value2',
    parameter3: 'value3' 
};
?var query = $.param(params);
document.write(query);


`jQuery!== JavaScript`
@gphilip这就是为什么我用"如果你正在使用jQuery ......"开始响应的原因.否则,如果你想在vanilla JS中实现它,你可以检查`jQuery.param()`的实现,这里https://github.com/jquery/jquery/blob/master/src/serialize.js :)
这实际上是正确的答案!表单的查询字符串是`$ .param($('#myform').serializeArray())`.
@Jesse,结果如下:`$('#myform').serialize()`
与我的答案不同,此代码支持嵌套对象,例如someStr = value1&someObj [a] = 5&someObj [b] = 6&someArr [] = 1&someArr [] = 2”。

3> Michael..:

这不会直接回答您的问题,但这是一个通用函数,它将创建一个包含查询字符串参数的URL.安全地转义参数(名称和值)以包含在URL中.

function buildUrl(url, parameters){
  var qs = "";
  for(var key in parameters) {
    var value = parameters[key];
    qs += encodeURIComponent(key) + "=" + encodeURIComponent(value) + "&";
  }
  if (qs.length > 0){
    qs = qs.substring(0, qs.length-1); //chop off last "&"
    url = url + "?" + qs;
  }
  return url;
}

// example:
var url = "http://example.com/";

var parameters = {
  name: "George Washington",
  dob: "17320222"
};

console.log(buildUrl(url, parameters));
// => http://www.example.com/?name=George%20Washington&dob=17320222



4> 小智..:

现在有用于此的API,特别是URLSearchParams API.给出的例子:

const params = new URLSearchParams({
  var1: "value",
  var2: "value2",
  arr: "foo",
});
console.log(params.toString());

注意:它最近与Chrome和Firefox 非常兼容,但如果您需要使用Microsoft和Apple浏览器,请务必小心,因为兼容性是部分的.


看来你可以直接做`new URLSearchParams({var1:"value",var2:"value2"...}).toString()`nowadays https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams#语法

5> manish_s..:

使用jQuery,你可以做到这一点 $.param

$.param({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })

// -> "action=ship&order_id=123&fees%5B%5D=f1&fees%5B%5D=f2&label=a+demo"



6> Przemek..:

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"



7> Stein G. Str..:

不,我不认为标准JavaScript有内置,但Prototype JS有这个功能(当然大多数其他JS框架也有,但我不知道),他们称之为序列化.

我可以推荐Prototype JS,它工作得很好.唯一的缺点我真的注意到它的大小(几百kb)和范围(很多代码为ajax,dom等).因此,如果你只想要一个表单序列化器,那就太过分了,而且严格来说,如果你只想要它的Ajax功能(主要是我用它),那就太过分了.除非你小心,否则你可能会发现它有点过分"神奇"(比如扩展它与Prototype JS函数接触的每个dom元素只是为了找到元素),这使得它在极端情况下变慢.



8> ImLeo..:

查询串可以帮助.

所以你可以

const querystring = require('querystring')

url += '?' + querystring.stringify(parameters)


对于前端应用程序,您还可以考虑使用https://www.npmjs.com/package/qs

9> Jonathan Lon..:

如果您不想使用库,则应该涵盖大多数/所有相同的表单元素类型.

function serialize(form) {
  if (!form || !form.elements) return;

  var serial = [], i, j, first;
  var add = function (name, value) {
    serial.push(encodeURIComponent(name) + '=' + encodeURIComponent(value));
  }

  var elems = form.elements;
  for (i = 0; i < elems.length; i += 1, first = false) {
    if (elems[i].name.length > 0) { /* don't include unnamed elements */
      switch (elems[i].type) {
        case 'select-one': first = true;
        case 'select-multiple':
          for (j = 0; j < elems[i].options.length; j += 1)
            if (elems[i].options[j].selected) {
              add(elems[i].name, elems[i].options[j].value);
              if (first) break; /* stop searching for select-one */
            }
          break;
        case 'checkbox':
        case 'radio': if (!elems[i].checked) break; /* else continue */
        default: add(elems[i].name, elems[i].value); break;
      }
    }
  }

  return serial.join('&');
}



10> Thibaut Barr..:

您实际上并不需要使用Prototype执行此操作的表单.只需使用Object.toQueryString函数:

Object.toQueryString({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })

// -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'


当然,您已经回答了将近10年前,但是现在不推荐使用此代码。
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有