Мне нужно требуется (поэтому, пожалуйста, не придирчиво к требованию, я его уже выбрал, и это требование) для преобразования определенных полей формы, в которые встроено "вложение объектов" имена полей, обратно к самим объектам. Ниже приведены некоторые типичные имена полей формы:
- phones_0_patientPhoneTypeId
- phones_0_phone
- phones_1_patientPhoneTypeId
- phones_1_phone
Поля формы выше были получены от объекта, подобного тому, который расположен внизу (см. «Данные»), и это формат объекта, который мне нужно собрать. Можно предположить, что любое поле формы с именем, которое содержит символ подчеркивания _, должно пройти это преобразование. Кроме того, что сегмент поля формы между подчеркиваниями, если он числовой, означает массив Javascript, в противном случае - объект.
Мне было легко придумать (несколько наивную) реализацию для "сплющивания" исходного объекта для использования формой, но я изо всех сил пытаюсь идти в другом направлении; ниже объекта / данных ниже я вставляю свою текущую попытку. Одна проблема (возможно, единственная?) Заключается в том, что в настоящее время он неправильно учитывает индексы массивов, но это может быть непросто, поскольку впоследствии объект будет закодирован как JSON, который не будет учитывать разреженные массивы. Так что, если "phones_1" существует, а "phones_0" нет, я тем не менее хотел бы убедиться, что слот для телефонов [0] существует, даже если это значение равно нулю.
Реализации, которые меняют то, что я начал, или совершенно другие, поощряются. Если интересно, дайте мне знать, хотите ли вы увидеть мой код для работающей "уплощающей" части. Заранее спасибо
Данные:
var obj = {
phones: [{
"patientPhoneTypeId": 4,
"phone": "8005551212"
},
{
"patientPhoneTypeId": 2,
"phone": "8885551212"
}]};
Код на сегодняшний день:
var unflattened = {};
for (var prop in values) {
if (prop.indexOf('_') > -1) {
var lastUnderbarPos = prop.lastIndexOf('_');
var nestedProp = prop.substr(lastUnderbarPos + 1);
var nesting = prop.substr(0, lastUnderbarPos).split("_");
var nestedRef, isArray, isObject;
for (var i=0, n=nesting.length; i<n; i++) {
if (i===0) {
nestedRef = unflattened;
}
if (i < (n-1)) { // not last
if (/^\d+$/.test(nesting[i+1])) {
isArray = true;
isObject = false;
}
else {
isArray = true;
isObject = false;
}
var currProp = nesting[i];
if (!nestedRef[currProp]) {
if (isArray) {
nestedRef[currProp] = [];
}
else if (isObject) {
nestedRef[currProp] = {};
}
}
nestedRef = nestedRef[currProp];
}
else {
nestedRef[nestedProp] = values[prop];
}
}
}