Typescript преобразовать строку в карту - PullRequest
0 голосов
/ 14 мая 2019

У меня есть эта строка (называемая currentExecution.variables):

{executionid=0c3246fb37e65e3368c8c4f30000016ab593bec244daa8df, timeout=10000}

и мне нужно преобразовать его в карту, чтобы я мог работать с записями, но мне трудно это делать. Я попытался, следуя этому ответу , преобразовать его в набор пар ключ-значение. Сначала я заменил = на: и {или} пробелом, затем разделил его в соответствии с ответом:

newString.split(/,(?=[^,]+:)/).map(s => s.split(': '));

но я не получаю должного результата и застрял без Карты. Чего не хватает? Или есть лучший / более быстрый способ сделать это?

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Вы также можете работать без регулярных выражений, но вы должны понять основную концепцию того, что сначала вы делите вдоль , с, а затем вдоль = с:

var data = "{executionid=0c3246fb37e65e3368c8c4f30000016ab593bec244daa8df, timeout=10000}";
var pairs = data.substring(1, data.length - 1).split(", "); // step 1, split using commas

var obj = pairs.reduce(function(acc, cur) {
  var pair = cur.split("="); // step 2, split using =
  acc[pair[0].trim()] = pair[1].trim();
  return acc;
}, {});

console.log(obj);
2 голосов
/ 14 мая 2019

Вы можете сделать следующее

  1. Удаление символов { и } из начала и конца строки. Не используйте replace, если в нем есть какие-либо вхождения.
  2. Разделить результат на каждый отдельный фрагмент, который образует пары ключ-значение.
  3. Разделить их на фактический ключ и значение
  4. Результат можно легко преобразовать в карту, поскольку конструктор принимает массив, в котором каждый элемент представляет собой массив с двумя элементами , и преобразует его в карту, где первый элемент является ключом, а второй значение:

let string = "{executionid=0c3246fb37e65e3368c8c4f30000016ab593bec244daa8df, timeout=10000}";

let keyValuePairs = string.slice(1, -1) //remove first and last character
  .split(/\s*,\s*/)                     //split with optional spaces around the comma
  .map(chunk => chunk.split("="));      //split key=value
  
const map = new Map(keyValuePairs);

console.log(map.get("executionid"));
console.log(map.get("timeout"));
1 голос
/ 14 мая 2019

Вы можете захватить пары ключ и значение в группе захвата, показанной в этом регулярном выражении .

Исходя из этого, вы можете пойти дальше и уменьшить его значение до карты.

const currentExecutionVariable = "{executionid=0c3246fb37e65e3368c8c4f30000016ab593bec244daa8df, timeout=10000}";

const pattern = /([A-Za-z0-9]+)\=([A-Za-z0-9]+)/g;

const matches = currentExecutionVariable.match(pattern);

const currentExecutionMap = matches.reduce((acc, curr) => {
	const [key, value] = curr.split('=');
	
	if (!acc.has(key)) {
		acc.set(key, value);
	}	
	return acc;
}, new Map());

for (const [key, value] of currentExecutionMap.entries()) {
  console.log (`${key}: ${value}`);
}

Обновление

Использование захваченных групп:

const currentExecutionVariable = "{executionid=0c3246fb37e65e3368c8c4f30000016ab593bec244daa8df, timeout=10000}";

const pattern = /([A-Za-z0-9]+)\=([A-Za-z0-9]+)/g;

let currentExecutionMap = new Map();

let capturedGroup;
while ((capturedGroup = pattern.exec(currentExecutionVariable))) {

  // 1st captured group is the key of the map
  const key = capturedGroup[1];

  // 2nd captured group is the value of the map
  const value = capturedGroup[2];

  if (!currentExecutionMap.has(key)) {
    currentExecutionMap.set(key, value);
  }
}

for (const [key, value] of currentExecutionMap.entries()) {
  console.log(`${key}: ${value}`);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...