Как мне разобрать строку, представляющую многомерный массив в массив?

95
7

Дана строка формата

"(1,(2,3,4),(5,6,(7,8,9,a,(b,c,d))))"

Какой самый простой способ преобразовать это в массив JavaScript?

[1, [2, 3, 4], [5, 6, [7, 8, 9, 'a', ['b', 'c', 'd']]]]

Использование как целых чисел, так и строк без строки не позволяет мне использовать встроенный синтаксический анализ, а многомерность не позволяет использовать простые разбиения или аналогичные.

спросил(а) 2019-01-13T04:30:00+03:00 2 года, 1 месяц назад
1
Решение
86

Один из вариантов - использовать регулярное выражение, чтобы превратить скобки в квадратные скобки, JSON.parse строки в кавычки, а затем JSON.parse:

const input = "(1,(2,3,4),(5,6,(7,8,9,a,(b,c,d))))";
const json = input
.replace(/\(/g, '[')
.replace(/\)/g, ']')
.replace(/[a-z]+/g, '"$&"');
console.log(JSON.parse(json));

ответил(а) 2019-01-13T04:40:00+03:00 2 года, 1 месяц назад
44

Используя oneliner вы можете сделать это

const str = "(1,(2,3,4),(5,6,(7,8,9,a,(b,c,d))))";
const array = JSON.parse(input.replace(/\(|\)/g, (match) => match === ")" ? "]" : "[").replace(/[a-zA-Z-_]/g, '"$&"'));

console.log(array)

ответил(а) 2019-01-13T05:51:00+03:00 2 года, 1 месяц назад
44

Вот другой подход, который использует функцию replaceAll для замены скобок из ([ and )] и гарантирует, что все буквы имеют кавычки вокруг них с помощью регулярного выражения:

const string = "(1,(2,3,4),(5,6,(7,8,9,a,(b,c,d))))";

String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.split(search).join(replacement);
};

const replaced = string.replaceAll("(", "[").replaceAll(")", "]").replace(/[a-zA-Z]+/g, '"$&"');

console.log(JSON.parse(replaced));

ответил(а) 2019-01-13T04:50:00+03:00 2 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема