Декодировать JSON, включая массив из параметра URL в JavaScript - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть этот URL:

http://localhost:5000/?orderID=000000034&fullname=Leonard+Niehaus&email=test%40gmail.com&items%5B0%5D%5BitemId%5D=9&items%5B0%5D%5Btitle%5D=Joghurt&items%5B0%5D%5Bqty%5D=1.0000&items%5B1%5D%5BitemId%5D=8&items%5B1%5D%5Btitle%5D=Alpenmilch&items%5B1%5D%5Bqty%5D=1.0000

Теперь я пытаюсь закодировать URL для объекта. Это моя текущая попытка:

function URLToArray(url) {
  var request = {};
  var pairs = url.substring(url.indexOf('?') + 1).split('&');
  for (var i = 0; i < pairs.length; i++) {
      if(!pairs[i])
          continue;
      var pair = pairs[i].split('=');
      request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
   }
   return request;
}

Однако мне нужна эта функция для возврата массива в виде массива JSON, а не так, как в настоящее время:

Screenshot of object

Как заставить мою функцию возвращать массив моего объекта?

1 Ответ

1 голос
/ 15 февраля 2020

Сначала вы можете получить объект с помощью справки по этому вопросу .

Пример использования URLSearchParams с регулярным выражением l oop:

const url = "http://localhost:5000/?orderID=000000034&fullname=Leonard+Niehaus&email=test%40gmail.com&items%5B0%5D%5BitemId%5D=9&items%5B0%5D%5Btitle%5D=Joghurt&items%5B0%5D%5Bqty%5D=1.0000&items%5B1%5D%5BitemId%5D=8&items%5B1%5D%5Btitle%5D=Alpenmilch&items%5B1%5D%5Bqty%5D=1.0000";

const regex = /^([a-z0-9]+)?\[([a-zA-Z0-9]+)\]*/mi;

function URLToArray(url) {
	url = decodeURIComponent(url);
  const args = new URLSearchParams(url.split('?')[1]);
  
  let request = {};
  args.forEach((value, key) => {
  	let baseKey = key;
    let ogValue = value;
    let lastKey = '';
  	while ((m = regex.exec(key)) !== null) {
    	if (m[1]) {
      	baseKey = m[1];
        value = request[baseKey] || {};
      	request[baseKey] = value;
      }
      
      if (m[2]) {
      	value = value[lastKey] || value;
        value[m[2]] = value[m[2]] || {};
      	lastKey = m[2];
      }
      
      key = key.replace(m[0], '');
    }
    
    if (lastKey) {
    	value[lastKey] = ogValue;
    } else {
    	request[baseKey] = value;
    }
  });
  return request;
}

console.log(URLToArray(url));

Это не идеально, у вас останутся вложенные объекты, в отличие от правильных массивов для вашего items, и есть вероятные библиотеки, которые могут достичь того же результата лучше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...