Как из формы сделать объект полям которого будут имена полей формы?
Добрый день, всем. Есть интересный вопрос, ИМХО, представим, что есть форма с такими полями:
<input name="form.pj" value="1235"> <input name="form.cr" value="123"> <input name="form.app.id" value="1234"> <input name="form.app.fm.id" value="12356"> Из данной формы нужно получить объект вот такого формата:
form{
"pf": 1235
"cr": 123
"app": {
"id": 1234
"fm": {
"id": 12356
}
}
}
|
Цитата:
|
Вобще странная задача. Если данная html-форма не предназначена для отпрваки на сервер, то зачем она тогда вобще нужна? Только чтобы извращенческим способом считать ее js-скриптом и сконвертить в объект?
Но не проще ли прям на сервере сформировать нужную json-структуру и записать в html-страницу? JS'у останется только распарсить json. |
dekey,
:write:
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</head>
<body>
<input name="form.pj" value="1235">
<input name="form.cr" value="123">
<input name="form.app.id" value="1234">
<input name="form.app.fm.id" value="12356">
<script>
var inp = document.querySelectorAll("input"), form = {};
for (var i=0; i<inp.length; i++) {
var arr = inp[i].name.split('.'), tmp = form;
for (var k=1; k<arr.length-1; k++) { !tmp[arr[k]] && (tmp[arr[k]] = {}) ; tmp = tmp[arr[k]]}
tmp[arr[k]] = inp[i].value
}
alert(JSON.stringify(form));
</script>
</body>
</html>
|
Цитата:
|
Цитата:
|
Ну, чета я фигню написал.
Ок, мой вариант, во много схожий с уже предложенным. Просто чуть более структурированный:
<!DOCTYPE HTML>
<form action="">
<input name="form.pj" value="1235">
<input name="form.cr" value="123">
<input name="form.app.id" value="1234">
<input name="form.app.fm.id" value="12356">
<script>
var formElement = document.querySelector('form');
var formData = toTree(serializeForm(formElement)).form;
alert(JSON.stringify(formData));
function serializeForm(form) {
return Array.apply(null, form).reduce(function(fields, field) {
fields[field.name] = field.value;
return fields;
}, {});
}
function toTree(object) {
var root = {};
for (var key in object) {
var subtree = root;
var path = key.split('.');
for (var i = 0; i < path.length - 1; i++) {
subtree = subtree[path[i]] || (subtree[path[i]] = {});
}
subtree[path[i]] = object[key];
}
return root;
}
</script>
</form>
Не работает в IE8! Хотя исправить очень просто. |
Цитата:
|
FormData
|
спасибо всем!
|
| Часовой пояс GMT +3, время: 00:26. |