URL编码的JavaScript数组
是否有任何js函数可以将数组转换为URL编码? 我完全是新手n JS。。。谢谢URL编码的JavaScript数组,javascript,urlencode,Javascript,Urlencode,是否有任何js函数可以将数组转换为URL编码? 我完全是新手n JS。。。谢谢 我的数组是一个键值数组。。。。 所以 与 myData['id']='354313'; myData['fname']='Henry'; myData['lname']='Ford'; myData.join('&'); //returns error, it doesn't work on such array... 有什么解决办法吗 哦,对不起。。。 我有一个这样的数组 var myData=new
我的数组是一个键值数组。。。。 所以 与
myData['id']='354313';
myData['fname']='Henry';
myData['lname']='Ford';
myData.join('&'); //returns error, it doesn't work on such array...
有什么解决办法吗
哦,对不起。。。 我有一个这样的数组
var myData=new Array('id'=>'354313','fname'=>'Henry','lname'=>'Ford');
然后我需要将数组转换为:
id=354313&fname=Henry&lname=Ford
查看函数escape和。您可以执行以下操作:
var myData = new Array('id=354313', 'fname=Henry', 'lname=Ford');
var url = myData.join('&');
试试这个:
var myData = {'id': '354313', 'fname':'Henry', 'lname': 'Ford'};
var out = [];
for (var key in myData) {
if (myData.hasOwnProperty(key)) {
out.push(key + '=' + encodeURIComponent(myData[key]));
}
}
out.join('&');
有关为什么要使用
hasOwnProperty
的解释,请参阅jgrunds answer中的,如果您想扩展阵列功能
Array.prototype.toQueryString = function(){
var out = new Array();
for(key in this){
out.push(key + '=' + encodeURIComponent(this[key]));
}
return out.join('&');
}
或者如果你想要一个独立的函数
function arrayToQueryString(array_in){
var out = new Array();
for(var key in array_in){
out.push(key + '=' + encodeURIComponent(array_in[key]));
}
return out.join('&');
}
如果使用对象而不是数组,则可以执行此操作(ES6):
如果使用jQuery,则可以使用$.param()。检查。 使用示例
var myData = {'id' : '354313', 'fname' : 'Henry', 'lname' : 'Ford'};
var url = "https://stackoverflow.com?" + $.param(myData);
输出为
https://stackoverflow.com?id=354313&fname=Henry&lname=Ford
还可用于对象数组(如来自jQuery(form).serializeArray()):
recursiveEncoded和recursiveDecoded的值如下所示:
a%5B%5D=1&a%5B%5D=2&a%5B%5D%3&b%5B%5D=1&b%5B%5D=2&b%5B%5D=3
a[1]=1&a[2]=2&a[3]=3&b[]=1&b[]=2&b[]=3
晚会迟到了,但我提出的这个解决方案可以处理递归性和嵌套数组/对象
function is(className, object) {
return Object.prototype.toString.call(object) === '[object '+ className +']';
}
const DataEncoder = function() {
this.levels = [];
}
DataEncoder.prototype.__dataEncoding = function(data, actualKey = null) {
let finalString = '';
if (actualKey) {
this.levels.push(actualKey);
}
const keys = Object.keys(data);
const l = keys.length;
for(let a = 0; a < l; a++) {
const key = keys[a];
let value = data[key];
if (is('Object', value)) {
finalString += this.__dataEncoding(value, key);
} else if (is('Array', value)) {
const arrValSize = value.length;
for (let b = 0; b < arrValSize; b++) {
let arrVal = value[b];
if (actualKey) {
finalString += actualKey;
for(let c = 1; c < this.levels.length; c++) finalString += '[' + this.levels[c] + ']';
if (arrVal === undefined || arrVal === null) arrVal = '';
finalString += '[' + key + '][]=' + arrVal + '&';
} else {
if (arrVal === undefined || arrVal === null) arrVal = '';
finalString += key + '[]=' + arrVal + '&';
}
}
} else {
if (actualKey) {
finalString += this.levels[0];
for(let c = 1; c < this.levels.length; c++) finalString += '[' + this.levels[c] + ']';
if (value === undefined || value === null) value = '';
finalString += '[' + key + ']=' + value + '&';
} else {
if (value === undefined || value === null) value = '';
finalString += key + '=' + value + '&';
}
}
}
this.levels.pop();
return finalString;
}
DataEncoder.prototype.encode = function(data) {
if (!is('Object', data) || data === {}) return null;
return this.__dataEncoding(data).slice(0, -1);
}
结果:
name=John&age=13&skills[]=games&skills[]=programming&skills[]=reading&skills[]=singing&invests[education][]=120.3&invests[education][]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&optical[optical][east][]=7&invests[deeper][first][landing]=5
name=John&age=13&skills[0]=games&skills[1]=programming&skills[2]=reading&skills[3]=singing&invests[education][0]=120.3&invests[education][1]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&invests[optical][east][0]=7&invests[deeper][first][landing]=5&invests[deeper][first][arrayLike][0][despite]=true&invests[deeper][first][arrayLike][0][superb]=yes&invests[deeper][first][arrayLike][0][omg][kiss][0]=la&invests[deeper][first][arrayLike][0][omg][maybe][thiss][wont][work]=false&invests[deeper][first][arrayLike][0][incredible][0]=lalolanda&invests[deeper][first][arrayLike][0][incredible][1]=raidcall&invests[deeper][first][arrayLike][0][incredible][2]=phase&invests[deeper][first][arrayLike][0][incredible][3][0]=5&invests[deeper][first][arrayLike][0][incredible][4][0][waw]=%40wesome
我知道它需要一个组件方法,但是可以很容易地添加
编辑,改进 结果:
name=John&age=13&skills[]=games&skills[]=programming&skills[]=reading&skills[]=singing&invests[education][]=120.3&invests[education][]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&optical[optical][east][]=7&invests[deeper][first][landing]=5
name=John&age=13&skills[0]=games&skills[1]=programming&skills[2]=reading&skills[3]=singing&invests[education][0]=120.3&invests[education][1]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&invests[optical][east][0]=7&invests[deeper][first][landing]=5&invests[deeper][first][arrayLike][0][despite]=true&invests[deeper][first][arrayLike][0][superb]=yes&invests[deeper][first][arrayLike][0][omg][kiss][0]=la&invests[deeper][first][arrayLike][0][omg][maybe][thiss][wont][work]=false&invests[deeper][first][arrayLike][0][incredible][0]=lalolanda&invests[deeper][first][arrayLike][0][incredible][1]=raidcall&invests[deeper][first][arrayLike][0][incredible][2]=phase&invests[deeper][first][arrayLike][0][incredible][3][0]=5&invests[deeper][first][arrayLike][0][incredible][4][0][waw]=%40wesome
您是说对数组中的每个字符串进行URL编码,还是将它们连接到URL查询字符串或..?URL编码仅应用于字符串。如果希望将其应用于数组,首先需要解释这是什么意思-是否希望将数组连接到单个字符串中?是否要对单个数组元素进行编码?如何处理非字符串数组元素(如对象、函数或其他数组)?最好编辑您的问题,至少包含一个您希望实现的示例(原始数组,生成的url编码字符串)代码>最好这样做:out.push(key+'='+encodeURIComponent(arr[key]);有自己的财产是不必要的,这数据你摇滚!固溶体!
const testData = {
name: "John",
age: 13,
skills: ['games', 'programming', 'reading', 'singing'],
invests: {
education: [120.3, 50.5],
kids: 70,
optical: {
north: 20.5,
south: 10.70,
west: 6,
east: [7]
},
deeper: {
first: {
landing: 5
}
}
}
};
const encoder = new DataEncoder();
encoder.encode(testData);
name=John&age=13&skills[]=games&skills[]=programming&skills[]=reading&skills[]=singing&invests[education][]=120.3&invests[education][]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&optical[optical][east][]=7&invests[deeper][first][landing]=5
function is(className, object) {
return Object.prototype.toString.call(object) === '[object '+ className +']';
}
const DataEncoder = function() {
this.levels = [];
this.actualKey = null;
}
DataEncoder.prototype.__dataEncoding = function(data) {
let uriPart = '';
const levelsSize = this.levels.length;
if (levelsSize) {
uriPart = this.levels[0];
for(let c = 1; c < levelsSize; c++) {
uriPart += '[' + this.levels[c] + ']';
}
}
let finalString = '';
if (is('Object', data)) {
const keys = Object.keys(data);
const l = keys.length;
for(let a = 0; a < l; a++) {
const key = keys[a];
let value = data[key];
this.actualKey = key;
this.levels.push(this.actualKey);
finalString += this.__dataEncoding(value);
}
} else if (is('Array', data)) {
if (!this.actualKey) throw new Error("Directly passed array does not work")
const aSize = data.length;
for (let b = 0; b < aSize; b++) {
let aVal = data[b];
this.levels.push(b);
finalString += this.__dataEncoding(aVal);
}
} else {
finalString += uriPart + '=' + encodeURIComponent(data) + '&';
}
this.levels.pop();
return finalString;
}
DataEncoder.prototype.encode = function(data) {
if (!is('Object', data) || data === {}) return null;
return this.__dataEncoding(data).slice(0, -1);
}
const testData = {
name: "John",
age: 13,
skills: ['games', 'programming', 'reading', 'singing'],
invests: {
education: [120.3, 50.5],
kids: 70,
optical: {
north: 20.5,
south: 10.70,
west: 6,
east: [7]
},
deeper: {
first: {
landing: 5,
arrayLike: [
{
despite: true,
superb: 'yes',
omg: {
kiss: ['la'],
maybe: {
thiss: {
wont: {
work: 'false'
}
}
}
},
incredible: ['lalolanda', 'raidcall', 'phase', [5], [{waw: '@wesome'}]],
}
]
}
}
}
};
const encoder = new DataEncoder();
encoder.encode(testData);
name=John&age=13&skills[0]=games&skills[1]=programming&skills[2]=reading&skills[3]=singing&invests[education][0]=120.3&invests[education][1]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&invests[optical][east][0]=7&invests[deeper][first][landing]=5&invests[deeper][first][arrayLike][0][despite]=true&invests[deeper][first][arrayLike][0][superb]=yes&invests[deeper][first][arrayLike][0][omg][kiss][0]=la&invests[deeper][first][arrayLike][0][omg][maybe][thiss][wont][work]=false&invests[deeper][first][arrayLike][0][incredible][0]=lalolanda&invests[deeper][first][arrayLike][0][incredible][1]=raidcall&invests[deeper][first][arrayLike][0][incredible][2]=phase&invests[deeper][first][arrayLike][0][incredible][3][0]=5&invests[deeper][first][arrayLike][0][incredible][4][0][waw]=%40wesome