2016-06-28 81 views
1

我正在研究网站的数据层,我需要传递一个字符串填充来自网站后端的值。JavaScript数组到URL编码字符串

这里是可变的我需要通过以下结构:

编码

>之前:

的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 lue = 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保持 “:” 和 “””,使用警报()或也一同保持 “:” 而不是高性能

编辑:

例数组:

arr : {key1: 'a', key2:'b', key3:'c'} 

非编码结果:

str : 'key1=a;key2=b;key3=c' 

期望的结果:

STR: 'KEY1%物3Da%3Bkey2%3DB%3Bkey3%的3Dc'

+0

您展示如何创建数组,会更简单修复它有 – charlietfl

回答

2

替换JSON.stringifyencodeURIComponent

所以,在看上面的例子有一个对象的数组。要分析,我会做:

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); 
+0

嘿乔丹感谢您的答案,但我指定它不起作用 – johan855

+0

这不会创建查询参数 – charlietfl

+0

嗯 - 也许我误解了这个问题。在对url进行编码之后,你是否需要将它们组合成一个查询字符串? –

-1

如果你使用jQuery,您可以使用$.param()。如果你不这样做,你可以遍历对象的键和格式化你的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>

正如其他答案指出,可以从第一个String做到这一点:

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('&')));