Преобразовать строку чисел, разделенных запятыми, в двумерный массив - PullRequest
2 голосов
/ 06 января 2020

У меня есть строка чисел примерно так:

var original = "547,449,737,452,767,421,669,367,478,367,440,391,403,392,385,405,375,421,336,447";

И я sh, чтобы преобразовать эту строку в двумерный массив, например:

[[547, 449] [737, 452] [767, 421] [669, 367] [478, 367] [440, 391] [403, 392] [385, 405] [375, 421] [336, 447]]

Но я ' У меня проблемы с этим. Я попытался использовать регулярное выражение:

var result = original.replace(/([-\d.]+),([-\d.]+),?/g, '[$1, $2] ').trim();

Но результатом была строка следующего, а не массив:

[547, 449] [737, 452] [767, 421] [669, 367] [478, 367] [440, 391] [403, 392] [385, 405] [375, 421] [336, 447]

Ответы [ 5 ]

3 голосов
/ 06 января 2020

Вы можете использовать методы split и reduce с оператором % для создания желаемого результата.

var original = "547,449,737,452,767,421,669,367,478,367,440,391,403,392,385,405,375,421,336,447";
const result = original.split(',').reduce((r, e, i) => {
  if (i % 2 == 0) r.push([]);
  r[r.length - 1].push(e);
  return r;
}, [])

console.log(result)
3 голосов
/ 06 января 2020

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

var original = "547,449,737,452,767,421,669,367,478,367,440,391,403,392,385,405,375,421,336,447";

const arr = original
  .match(/\d+,\d+/g)
  .map(substr => substr.split(',').map(Number));
console.log(arr);
2 голосов
/ 06 января 2020

Вы можете искать цифры с запятой между ними, заменять, добавлять скобки и анализировать как JSON.

var original = "547,449,737,452,767,421,669,367,478,367,440,391,403,392,385,405,375,421,336,447",
    array = JSON.parse('[' + original.replace(/\d+,\d+/g, '[$&]') + ']');

console.log(array);
0 голосов
/ 06 января 2020

Использование Regex и JSON .parse обходятся дороже. Сделайте это, используя массив для матрицы, как показано ниже

const original = "547,449,737,452,767,421,669,367,478,367,440,391,403,392,385,405,375,421,336,447";

const arrayToMatrix = (array, columns) => Array(Math.ceil(array.length / columns)).fill('').reduce((acc, cur, index) => {
  return [...acc, [...array].splice(index * columns, columns)]
}, []);

const result = arrayToMatrix(original.split(','),2);

console.log(result);
0 голосов
/ 06 января 2020

Это может быть хорошим вариантом использования .matchAll():

var original = "547,449,737,452,767,421,669,367,478,367,440,391,403,392,385,405,375,421,336,447";

var array = Array.from(original.matchAll(/(\d+),(\d+)/g), 
                       ([, ...m]) => m.map(Number));

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