동적 필드가있는 양식이 있습니다. 제출하기 전에 직렬화 된 데이터의 형식을 지정하고 싶습니다. Javascript에서 PHP $$ var를 재현해야합니다.
다음은 PHP의 아이디어입니다.
나는 이것을 가지고있다 :
$data = array('field1', 0, 'key');
$val = 'somevalue';
그리고 나는 이것을 원한다 :
$field1[0]['key'] = 'somevalue';
그래서, 내가 PHP에 있었다면 어떻게 진행할 것인지는 다음과 같습니다 (작동하는지 확실하지 않습니다) :
$data = array('field1', 0, 'key');
$val = 'somevalue';
$field1 = array();
$f = $data[0]; # 'field1'
$i = $data[1]; # 0
$k = $data[2]; # 'key'
$$f[$i][$k] = $val; # $field1[0]['key'] = 'somevalue';
나는 우리가 window[var]
JS에서 사용할 수 있다는 것을 보았지만 그것을 작동하도록 관리하지 못했습니다.
var val = 'somevalue';
var field1 = [];
var f = data[0];
var i = data[1];
var k = data[2];
window[f][i] = {}; # field1[0] must be an object
window[f][i][k] = val; # field1[0] = {'key': 'somevalue'}
보시다시피 매우 간단하지 않습니다. 게다가이 코드는 하나의 필드가 아니라 많은 (field2, field3 ...)이기 때문에 foreach 내에 있습니다.
마지막에는 다음과 같은 것이 있습니다.
var result = {
field1: field1,
field2: field2,
...
field10: field10
}
// console.log(result);
{
field1: [
0 : Object { key: 'somevalue', key2: 'othervalue' }
...
5 : Object { key: 'somevalue2', key2: 'othervalue2' }
]
field2: [...]
...
}
편집하다:
@Nina Scholz의 답변에 감사드립니다.
function formatData(object, keys, value) {
var last = keys.pop();
keys.reduce((o, k, i, a) =>
o[k] = o[k] || (isFinite(i + 1 in a ? a[i + 1] : last) ? [] : {}),
object
)[last] = value;
return object;
}
var data = form.serializeArray();
var result = {};
$(data).each(function(i) {
name = data[i].name; // field name. Ex: "field1[0][key]"
value = data[i].value; // field value
// Format: "field1[0][key]" => array("field1", "0", "key")
array = name.split('[');
array[1] = array[1].replace(']', '');
array[2] = array[2].replace(']', '');
// Format every array of data in a big object "result"
formatData(result, array, value);
});
// JSON encoding of "result" in a hidden field for post-treatment
$('input[name=data]').val(JSON.stringify(result));
개체를 직접 가져와 설정 값으로 이동할 수 있습니다. 이 접근 방식은 기본값으로 배열의 숫자 인 경우 키를 확인합니다. 배열이나 객체가 주어지면 데이터 구조를 변경하지 않습니다.
function setValue(object, keys, value) {
var last = keys.pop();
keys.reduce((o, k, i, a) =>
o[k] = o[k] || (isFinite(i + 1 in a ? a[i + 1] : last) ? [] : {}),
object
)[last] = value;
return object;
}
var val = 'somevalue',
data = ['field1', 0, 'key'],
result = {};
setValue(result, data, val);
console.log(result);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다