создать из строки вложенный объект

344
03 февраля 2017, 06:51

есть строка:

var q = 'user.name.firstname=Bob&user.name.lastname=Smith&user.favoritecolor=Light%20Blue'

нужно из нее сделать такой объект

{
  'user': {
    'name': {
      'firstname': 'Bob',
      'lastname': 'Smith'
     },
    'favoritecolor': 'Light Blue'
   }
}

застрял на добавлении вложенных объектов, вот пример моего кода

function convertQueryToMap(query) {
var tmp = {};
query = query.replace(/\./ig, ':');
query = query.replace(/\=/ig, ':');
query = query.replace(/\%20/ig, ' ');
var arr = query.split('&');
for (var i = 0; i < arr.length; i++){
    var elem = arr[i].split(':');
    for (var j = 0; j < elem.length; j++){
        if(tmp[elem[j]] == undefined){
            tmp[elem[j]] = {};
        }
    }
}
return tmp;
}
Answer 1

var q = 'user.name.firstname=Bob&user.name.lastname=Smith&user.favoritecolor=Light%20Blue'; 
 
/*{ 
  'user': { 
    'name': { 
      'firstname': 'Bob', 
      'lastname': 'Smith' 
     }, 
    'favoritecolor': 'Light Blue' 
   } 
}*/ 
 
function convertQueryToMap(query) { 
  var tmp = {}, tmp1; 
  query = query.replace(/\./ig, ':'); 
  query = query.replace(/\=/ig, ':'); 
  query = query.replace(/\%20/ig, ' '); 
  var arr = query.split('&'); 
 
  for (var i = 0; i < arr.length; i++){ 
    var elem = arr[i].split(':'); 
    tmp1 = tmp; 
    for (var j = 0; j < elem.length - 2; j++){ 
        if(tmp1[elem[j]] == undefined){ 
            tmp1[elem[j]] = {}; 
        } 
        tmp1 = tmp1[elem[j]]; 
    } 
    tmp1[elem[j]] = elem[j+1]; 
  } 
 
  return tmp; 
} 
 
var res = convertQueryToMap(q); 
console.log(res);

Answer 2

Воспользуемся передачей по ссылке:

let q    = 'user.name.firstname=Bob&user.name.lastname=Smith&user.favoritecolor=Light%20Blue', 
    data = {}; 
 
// Каждую запись "Ключ=Значение" 
q.split('&').forEach(part => { 
  let [path, value] = part.split('='); // Ключ и значение 
   
  let pointer = data; // Указываем на корень объекта 
  path.split('.').forEach((part, i, arr) => { // Делим по точке (кусочки пути) 
    // Если очередной части пути ещё не находится в базе 
    if(!pointer[part]) 
      // То добавляем либо новый объект, либо значение, если это последняя часть 
      pointer[part] = i === arr.length - 1 ? decodeURIComponent(value) : {}; 
     
    // Смещаем указатель на новый объект. Или на значение, но это не важно тогда 
    pointer = pointer[part]; 
  }); 
}); 
 
console.info(data);

Answer 3

var s = 'user.name.firstname=Bob&user.name.lastname=Smith&user.favoritecolor=Light%20Blue'; 
 
var res = {}; 
 
s.replace(/([^=&]+|(?==))(=?)([^&]*)/g, function (m, key, eq, val) { 
  var path = decodeURIComponent(key).split("."); 
  key = path.pop(); 
  val = eq ? decodeURIComponent(val) : true; 
   
  var obj = res; 
 
  for (var q=0; q<path.length; ++q) { 
    obj = obj[path[q]] = obj[path[q]] || {}; 
  } 
 
  obj[key] = val; 
}); 
 
console.log(res);

READ ALSO
Вызвать функцию в функции

Вызвать функцию в функции

Есть такая структура (которую желательно бы не менять кардинально):

341
Плавность при scroll&#39;е

Плавность при scroll'е

Здравствуйте

577
AngularJS: Как записать данные в JSON файл? [требует правки]

AngularJS: Как записать данные в JSON файл? [требует правки]

Подскажите как записать данные в JSON файл? Мне нужно, чтобы после заполнения полей и нажатия на кнопку Save данные сохранялись в JSON файле

398
Как работает NPM модуль request-promise

Как работает NPM модуль request-promise

Подключил модуль request-promiseДля отправки файла использую вот такой код

520