我正在处理网站的数据层,我需要传递一个字符串,其中包含来自网站后端的值。
这是我需要传递的变量的结构:
>编码前:
的transaction_id = 0815/2009; transaction_cid = 54AB; ITEM_ID = 402163045080; item_va 略= 25.20; item_quantity = 1; 的transaction_id = 0815/2009; transaction_cid = 54AB; ITEM_ID = 402163045080; item_va 略= 25.20; item_quantity = 1;
>编码后:
的transaction_id%3D0815%2F2009%3Btransaction_cid%3D54AB%3Bitem_id%3D40216304 5080%3Bitem_value%3D25.20%3Bitem_quantity%3D1%3Bitem_id%3D847163029054%3Bi tem_value%3D16.81%3Bitem_quantity%3D2
我设法用这种形式创建一个包含必要数据的数组:
' [{" TRANSACTION_ID":" 233684"" transaction_cid":" d2871c13c507583048d8ecf4a16f94c0""我 tem_id":" 3524"" ITEM_VALUE":" 4915.13"" item_quantity":" 1" }]',
但我需要的是url编码字符串中数组的所有这些元素。
我没有想法,因为我尝试的所有东西似乎都不起作用。
使用JSON.stringify保持":"而#34;"",使用alert()或join也会保留":"并且不具备表现力。
编辑:
示例数组:
arr : {key1: 'a', key2:'b', key3:'c'}
非编码结果:
str : 'key1=a;key2=b;key3=c'
期望的结果:
str:' key1%3Da%3Bkey2%3Db%3Bkey3%3Dc'
答案 0 :(得分:2)
将JSON.stringify
替换为encodeURIComponent
:
因此,在上面的示例中,您有一个包含一个对象的数组。为了解析这个问题,我会这样做:
var params = elementArray[0];
var encoded_params = [];
for (var prop in params){
if (params.hasOwnProperty(prop)) {
encoded_params.push(prop+ "=" +encodeURIComponent(params[prop]));
}
}
var query_string = "?" + encoded_params.join("&");
注意:强> 我希望从一开始就解决这个问题,用你原来的字符串:
transaction_id = 0815/2009; transaction_cid = 54AB; item_id = 402163045080; item_va lue = 25.20; item_quantity = 1;
// break string into components by splitting on `;`:
var data_as_str = "transaction_id=0815/2009;transaction_cid=54AB;item_id=402163045080;item_va lue=25.20;item_quantity=1;";
var raw_params = data_as_str.split(";");
// create a new array where we will store our encoded params
var encoded_params = [];
// traverse the split string components
for (var i=0; i<raw_params.length; i++){
var element = raw_params[i];
// check that the element exists
// for example, the trailing `;` will create an empty element
// which we do not want to include
if (!element){
continue;
}
// split on `=` to get key, value
var key = element.split("=")[0];
var value = encodeURIComponent(element.split("=")[1]);
// build a new param string and push to clean array
encoded_params.push(key+ "=" +value);
}
// after loop has completed, join elements
// in clean array to complete query string
var query_string = "?" + encoded_params.join("&");
alert(query_string);
答案 1 :(得分:-1)
如果您使用的是jQuery,则可以使用$.param()
。如果不这样做,则可以遍历Object的键并格式化QueryString。在示例中,我使用Object.keys()
来获取键数组Array.map()
以循环键并返回一个新数组,即ES6 template String
。使用encodeURIComponent
,您将获得编码的QueryString。
var obj = {key1: 'a', key2:'b', key3:'c'};
console.log(encodeURIComponent($.param(obj)));
console.log(encodeURIComponent(Object.keys(obj).map(key=>`${key}=${obj[key]}`).join('&')));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
正如另一个答案中所指出的,你可以从第一个字符串中做到这一点:
var str = "transaction_id=0815/2009;transaction_cid=54AB;item_id=402163045080;item_va lue=25.20;item_quantity=1;transaction_id=0815/2009;transaction_cid=54AB;item_id=402163045080;item_value=25.20;item_quantity=1;";
console.log(encodeURIComponent(str.split(';').filter(a=>a).join('&')));