2011-03-31 63 views
52

我有一个JavaScript对象,我需要将其扁平化为一个字符串,以便我可以传递查询字符串,我该怎么做?即:平展javascript对象作为查询字符串传递

{ cost: 12345, insertBy: 'testUser' }将成为cost=12345&insertBy=testUser

我不能使用jQuery AJAX调用这个电话,我知道我们可以使用和传递对象作为data但不是在这种情况下。尽管如此,使用jQuery拼合成对象也是可以的。

谢谢。

+0

可能重复的[序号JSON来查询在JavaScript/jQuery的字符串](http://stackoverflow.com/questions/3308846/serialize-json-to-query-string-in-javascript-jquery) – 2011-03-31 19:20:58

+0

请在发布前搜索。这已被问及之前回答。 – 2011-03-31 19:21:08

+0

对不起,我一直在搜索“flatten”作为关键字,并找不到它。谢谢。 – Saxman 2011-03-31 22:14:06

回答

64

你想​​:

var str = $.param({ cost: 12345, insertBy: 'testUser' }); 
// "cost=12345&insertBy=testUser" 

注意,这是jQuery的内部使用序列化作为data参数传递对象的功能。

15

尝试$.param()方法:

var result = $.param({ cost: 12345, insertBy: 'testUser' }); 
77

这里有一个非jQuery的版本:

function toQueryString(obj) { 
    var parts = []; 
    for (var i in obj) { 
     if (obj.hasOwnProperty(i)) { 
      parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i])); 
     } 
    } 
    return parts.join("&"); 
} 
+0

它工作的很棒! – yorch 2013-10-25 02:46:07

+0

当我尝试它时,它使用参数号,而不是查询的第一部分的名称? Javascript使我疯狂。 – 2014-06-13 01:03:38

+0

@ElectricLlama:你在使用数组吗?你有一些示例代码? – 2014-06-15 14:11:39

3
var myObj = { cost: 12345, insertBy: 'testUser' }, 
    param = '', 
    url = 'http://mysite.com/mypage.php';  

for (var p in myObj) { 
    if (myObj.hasOwnProperty(p)) { 
    param += encodeURIComponent(p) + "=" + encodeURIComponent(myObj[p]) + "&"; 
    } 
} 

window.location.href = url + "?" + param; 
+1

这个答案有一个错误,它会在最后一个'param'后面留下'&' – yorch 2013-10-25 02:45:28

3

一般的JavaScript:

function toParam(obj) { 
    var str = ""; 
    var seperator = ""; 
    for (key in obj) { 
    str += seperator; 
    str += enncodeURIComponent(key) + "=" + encodeURIComponent(obj[key]); 
    seperator = "&"; 
    } 
    return str; 
} 


toParam({ cost: 12345, insertBy: 'testUser' }) 
"cost=12345&insertBy=testUser" 
15

这里是另一种非jQuery的版本,利用lodash或者如果您已经在使用一个下划线那些图书馆:

var toQueryString = function(obj) { 
    return _.map(obj,function(v,k){ 
    return encodeURIComponent(k) + '=' + encodeURIComponent(v); 
    }).join('&'); 
}; 
12

This是一个古老的问题,但在谷歌搜索的顶部,所以我加入这个完整性。

如果1)你不希望用户的jQuery,但2)要隐蔽一个嵌套对象的查询字符串,然后(建设关添唐氏和盖伊的回答)的,使用此:

function toQueryString(obj, urlEncode) { 
    // 
    // Helper function that flattens an object, retaining key structer as a path array: 
    // 
    // Input: { prop1: 'x', prop2: { y: 1, z: 2 } } 
    // Example output: [ 
    //  { path: [ 'prop1' ],  val: 'x' }, 
    //  { path: [ 'prop2', 'y' ], val: '1' }, 
    //  { path: [ 'prop2', 'z' ], val: '2' } 
    // ] 
    // 
    function flattenObj(x, path) { 
     var result = []; 

     path = path || []; 
     Object.keys(x).forEach(function (key) { 
      if (!x.hasOwnProperty(key)) return; 

      var newPath = path.slice(); 
      newPath.push(key); 

      var vals = []; 
      if (typeof x[key] == 'object') { 
       vals = flattenObj(x[key], newPath); 
      } else { 
       vals.push({ path: newPath, val: x[key] }); 
      } 
      vals.forEach(function (obj) { 
       return result.push(obj); 
      }); 
     }); 

     return result; 
    } // flattenObj 

    // start with flattening `obj` 
    var parts = flattenObj(obj); // [ { path: [ ...parts ], val: ... }, ... ] 

    // convert to array notation: 
    parts = parts.map(function (varInfo) { 
     if (varInfo.path.length == 1) varInfo.path = varInfo.path[0];else { 
      var first = varInfo.path[0]; 
      var rest = varInfo.path.slice(1); 
      varInfo.path = first + '[' + rest.join('][') + ']'; 
     } 
     return varInfo; 
    }); // parts.map 

    // join the parts to a query-string url-component 
    var queryString = parts.map(function (varInfo) { 
     return varInfo.path + '=' + varInfo.val; 
    }).join('&'); 
    if (urlEncode) return encodeURIComponent(queryString);else return queryString; 
} 

使用像:

console.log(toQueryString({ 
    prop1: 'x', 
    prop2: { 
     y: 1, 
     z: 2 
    } 
}, false)); 

,输出:

prop1=x&prop2[y]=1&prop2[z]=2 
+0

谢谢,非常有用的代码 – Alexey 2017-06-15 13:52:41

1

您可以使用的jsfiddle这个

function serialize(obj) 
{ 
    let str = [] 

    for(var p in obj) 
    { 
     if(obj.hasOwnProperty(p)) str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])) 
    } 

    return str.join('&') 
} 

尝试此链接https://jsfiddle.net/yussan/kwmnkca6/

30

我ES6版本(纯JavaScript,没有jQuery的):

function toQueryString(paramsObject) { 
    return Object 
    .keys(paramsObject) 
    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(paramsObject[key])}`) 
    .join('&') 
    ; 
} 
+0

不错,男士。 – victorkurauchi 2016-11-01 12:31:22

+0

感谢您的摘录! – Mirage 2017-04-12 08:52:37

+1

太棒了!但是在调用'.map(...)'之前,我添加了'.filter(key => paramsObject [key]!== null)'(或其他),以防止包含空值 – Daria 2017-08-15 13:55:49

4

另一个版本:

function toQueryString(obj) { 
    return Object.keys(obj).map(k => { 
     return encodeURIComponent(k) + "=" + encodeURIComponent(obj[k]) 
    }) 
    .join("&"); 
} 
1

ES6版本Jrop's answer(也解析嵌套参数)

const toQueryString = (obj, urlEncode = false) => { 
    if (!obj) return null; 
    const flattenObj = (x, path = []) => { 
    const result = []; 
    Object.keys(x).forEach((key) => { 
     if (!Object.prototype.hasOwnProperty.call(x, key)) return; 
     const newPath = path.slice(); 
     newPath.push(key); 
     let vals = []; 
     if (typeof x[key] === 'object') { 
     vals = flattenObj(x[key], newPath); 
     } else { 
     vals.push({ path: newPath, val: x[key] }); 
     } 
     vals.forEach((v) => { 
     return result.push(v); 
     }); 
    }); 
    return result; 
    }; 

    let parts = flattenObj(obj); 
    parts = parts.map((varInfo) => { 
    if (varInfo.path.length === 1) { 
     varInfo.path = varInfo.path[0]; // eslint-disable-line no-param-reassign 
    } else { 
     const first = varInfo.path[0]; 
     const rest = varInfo.path.slice(1); 
     varInfo.path = `${first}[${rest.join('][')}]`; // eslint-disable-line no-param-reassign 
    } 
    return varInfo; 
    }); 

    const queryString = parts.map((varInfo) => { 
    return `${varInfo.path}=${varInfo.val}`; 
    }).join('&'); 
    if (urlEncode) { 
    return encodeURIComponent(queryString); 
    } 
    return queryString; 
}; 
+0

虽然此代码可能回答问题,提供关于如何解决问题和/或为什么解决问题的附加背景可以提高答案的长期价值。请阅读此[如何回答](http://stackoverflow.com/help/how-to-answer)以提供高质量的答案。 – thewaywewere 2017-06-25 15:15:34

相关问题