Как разбить одномерный массив на двумерный из строки?

Я получаю массив в виде строки
[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]
Мое решение: заменить все (, 0, ) на (], [). Удалить последнее (, 0), после это пропарсить через JSON
В итоге получу вот это:
[[3, 2, 1], [5, 6, 4], [1, 5, 3], [2, 2, 2]]

Но мой код не работает:
const regex = /\(,\s*0\s*,\s*\)/g;
const str = "[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]";
const replacedStr = str.replace(regex, "], [");
console.log(replacedStr);


В логах выходит тот же массив что и получил
[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
PeterLS
@PeterLS
Руководитель веб-студии
Ваш регулярное выражение \(\,\s*0\s*\,\s*\) использует круглые скобки, которых нет в исходной строке, это приводит к тому, что замены не происходит.
Ваша исходная строка представляет собой массив в квадратных скобках [], а не в круглых (), и вместо пробела с запятой, ,, Вам необходимо заменить , 0, на ], [.
Также, чтобы удалить последний , 0, вы можете сначала выполнить отдельную замену для этого случая.

Вот исправленный код:
const str = "[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]";

// Заменяем все вхождения ', 0,' на '], [' 
let replacedStr = str.replace(/, 0,/g, "], [");

// Удаляем последнее вхождение ', 0' (в конце строки перед закрытием скобки)
replacedStr = replacedStr.replace(/, 0\]/, "]");

// Для безопасной работы с JSON.parse обрамляем весь массив в дополнительные скобки
replacedStr = "[" + replacedStr + "]";

console.log(replacedStr); // Выводит строку в нужном формате

// Преобразуем строку в JSON
const jsonArray = JSON.parse(replacedStr);

console.log(jsonArray); // Выводит массив массивов

Выполнив этот код, вы получите желаемый результат в виде массива массивов:
[[3, 2, 1], [5, 6, 4], [1, 5, 3], [2, 2, 2]]
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
const inString = "[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]";
let data = JSON.parse(inString);
let outData = [];
let outDataElem = [];
for (let i in data){
  let el = data[i];
  if(!el){ // Если 0
    if(outDataElem.length){ // Если outDataElem уже что-то содержит
      outData.push([...outDataElem]);
    };
    outDataElem = [];
    continue;
  };
  outDataElem.push(el);
};
if(outDataElem.length){
  outData.push([...outDataElem]);
};
console.log(outData);
Ответ написан
Комментировать
AlexanderK-A
@AlexanderK-A
UTC+10
Доброго дня!
Предложил бы более обобщенный вариант по типу "группировка элементов по N штук" из текстовой строки.

На выходе получается нормализованный массив строковых элементов, которые потом можно преобразовывать, например, в число и т.д. Размер группы (сколько элементов во вложенных) массивах - задается параметром groupSize.

(()=>{
    const source = '[3, 2, 1, 0, 5, 6, 4, 0, 1, 5, 3, 0, 2, 2, 2, 0]';
    
    // тест
    console.log(groupItems(source));
    
    function groupItems(source, groupSize = 3){
        return (
            (source??'')
                .trim()
                .replace('[', '').replace(']', '')
                .split(',')
                .map(e=>e.trim())
                .filter(e=>e!=='0')
                .reduce((arrays, cur, i)=>{
                    if(i % groupSize === 0){
                        return [
                            ...arrays,
                            [cur]
                        ];
                    } else{
                        return [
                            ...arrays.slice(0, arrays.length-1),
                            [...arrays.at(-1), cur]
                        ];
                    }
                }, [])
        );        
    }
})()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы