Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Преобразование объекта в URL строку (https://javascript.ru/forum/misc/45970-preobrazovanie-obekta-v-url-stroku.html)

Hapson 22.03.2014 18:56

Преобразование объекта в URL строку
 
Написал вот такую функцию:
function objectToUrlString(obj){
	function convert(param){
		var str = "";
		for(var x in param){if(!param.hasOwnProperty(x)){continue;}
			str += ifArray(x, param[x]) +"&";
		}
		return str.trim("&");
	}
	function ifArray(key, val){
		if($G.isObject(val) || $G.isArray(val)){
			var str = "", index;
			for(var x in val){if(!val.hasOwnProperty(x)){continue;}
				index = /[^0-9]+/.test(x) ? key +"['"+ x +"']" : key +"["+ x +"]";
				str += ifArray(index, val[x]) +"&";
			}
			return str.trim("&");
		}
		switch(val){
			case false: case undefined: case NaN: case Infinity: val = 0; break;
			case true: val = 1; break;
			case null: val = ""; break;
			default: val = val instanceof String ? val : val.toString();
		}
		val = encodeURIComponent(val);
		return encodeURIComponent(key) +"="+ val;
	}
	return convert(obj);
}

param = {
	cars:{
		auto:["opel", "daewoo"],
		bus:["tatra", "ikarus"]
	}
};

param = paramToString(param);

// cars["auto"][0]=opel&cars["auto"][1]=daewoo&cars["bus"][0]=tatra&cars["bus"][1]=ikarus

Она конвертирует объект с любой вложенностью в URL строку - можно всунуть ее в GET или POST.
В php потом все это будет в массивах GET или POST (после ajax отправки)
Вроде работает как хотел, но интересно, можно ли через эту функцию подсунуть какую-нибудь бяку на сервер? Или лучше использовать JSON?

Vlasenko Fedor 22.03.2014 19:05

Цитата:

Сообщение от Hapson
можно ли через эту функцию подсунуть какую-нибудь бяку на сервер?

на сервере все равно нужно проверять данные, ибо я могу сам отправить их без вашего скрипта
http://www.php.net/manual/ru/book.filter.php
ваш пример
http://javascript.ru/php/serialize
и лучше использовать JSON
или если используете jquery
https://api.jquery.com/serialize/

Hapson 22.03.2014 19:16

Poznakomlus,
На сервере конечно проверять нужно.
serialize из jquery - это немного из другой оперы. Она форму сериализует для отправки.
вторая serialize - это аналог php функции.
А эта на выходе выдает тоже что и serialize jquery, но сериализует не форму, а объект.

Хотя да, JSON наверно проще.

Hapson 22.03.2014 19:20

PS аналог serialize из jquery я уже написал
$G.serializeForm = function(form){
	/**
	* @form - объект формы
	* 
	* @return {string} - строка пригодная для отправки в POST Ajax
	*/
	var fields = form.elements;
	var field, name, value, type;
	var res = '';
	for(var z = 0; z < fields.length; z++){
		field = fields[z];
		name = field.name;
		value = field.value;
		type = field.type;
		if(typeof name == "undefined" || name == ""){continue;}
		if(type == 'checkbox' || type == 'radio'){
			if(field.checked){
				res += name +"="+ encodeURIComponent(value) +"&";
			}
			continue;
		}
		if(type == "select-multiple"){
			for(var so = 0; so < field.length; so++){
				if(field[so].selected){
					res += name +"="+ encodeURIComponent(field[so].value) +"&";
				}
			}
			continue;
		}
		res += name +"="+ encodeURIComponent(value) +"&";
	}
	return res.trim("&");
};

Hoshinokoe 23.03.2014 11:21

Hapson,

У jquery есть готовый метод, который сериализует объект в строку: param.
Цитата:

Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.
Для обратного преобразования deparam (идет как отдельный плагин).

nerv_ 23.03.2014 11:44

Цитата:

Сообщение от Hoshinokoe
У jquery есть готовый метод, который сериализует объект в строку: param

Ему не нужен жуквери :) Не предлагай ему жуквери, а то он обидеться)

В прошлой теме я попытался озвучить ряд причин "почему жуквери" (но не все), но как видишь безуспешно)


Часовой пояс GMT +3, время: 05:20.