在不知道JavaScript对象的键的情况下,我如何将…

var obj = {
   param1: 'something',
   param2: 'somethingelse',
   param3: 'another'
}

obj[param4] = 'yetanother';

…到…

var str = 'param1=something&param2=somethingelse&param3=another&param4=yetanother';

...?


当前回答

一行没有依赖项:

new URLSearchParams(obj).toString();
// OUT: param1=something&param2=somethingelse&param3=another&param4=yetanother

使用它的URL内置如下:

let obj = { param1: 'something', param2: 'somethingelse', param3: 'another' }
obj['param4'] = 'yetanother';
const url = new URL(`your_url.com`);
url.search = new URLSearchParams(obj);
const response = await fetch(url);

[编辑2020年4月4日]:空值将被解释为字符串'null'。

[编辑2022年3月9日]:浏览器兼容性

其他回答

只是为了记录,如果你有一个支持ES6的浏览器,这里有一个减少的解决方案:

Object.keys(obj).reduce((prev, key, i) => (
  `${prev}${i!==0?'&':''}${key}=${obj[key]}`
), '');

这里有一个正在运行的片段!

//仅用于测试目的 让obj = {param1: 12, param2: "test"}; //实际解决方案 let result = Object.keys(obj)。Reduce ((prev, key, i) => ( “$ {prev} ${我! = = 0 ?“&”:“}${关键}= $ {obj[主要]}’ ),“); //运行代码片段来显示发生了什么! console.log(结果);

var str = '';

for( var name in obj ) {
    str += (name + '=' + obj[name] + '&');
}

str = str.slice(0,-1);

试试吧。

例如:http://jsfiddle.net/T2UWT/

该方法使用递归进入对象层次结构并生成rails样式参数,rails将其解释为嵌入的散列。objtoarams生成一个带有额外&号的查询字符串,objToQuery删除最后一个&号。

 function objToQuery(obj){
  let str = objToParams(obj,'');
  return str.slice(0, str.length);
}
function   objToParams(obj, subobj){
  let str = "";

   for (let key in obj) {
     if(typeof(obj[key]) === 'object') {
       if(subobj){
         str += objToParams(obj[key], `${subobj}[${key}]`);
       } else {
         str += objToParams(obj[key], `[${key}]`);
       }

     } else {
       if(subobj){
         str += `${key}${subobj}=${obj[key]}&`;
       }else{
         str += `${key}=${obj[key]}&`;
       }
     }
   }
   return str;
 }

ES6:

函数参数(data) { 返回种(数据)。地图(关键= > ' ${关键}= $ {encodeURIComponent(数据(关键))}”). join (' & '); } console.log (params ({foo:“酒吧”})); Console.log (params({foo: 'bar', baz: 'qux$'}));

这个一行程序还处理嵌套对象和JSON。根据需要对它们进行字符串化:

let qs = Object.entries(obj).map(([k, v]) => `${k}=${encodeURIComponent(typeof (v) === "object" ? JSON.stringify(v) : v)}`).join('&')