У меня есть строка, которая может быть любой длины.

aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt

Я хочу иметь возможность получить все группы персонажей из него. Количество групп в строке не ограничено.

Группа состоит из 3 столбцов и 4 строк. Так что, если я разделю эту строку на группы, это будет выглядеть так ...

aaa  bbb  ccc  ddd  eee
fff  ggg  hhh  iii  jjj
kkk  lll  mmm  nnn  ooo
ppp  qqq  rrr  sss  ttt

Итак, первая группа персонажей будет ...

aaa fff kkk ppp

Во-вторых ...

bbb ggg lll qqq

0
JacketPotatoeFan 3 Май 2019 в 16:44

3 ответа

Лучший ответ

Вы можете сделать это в следующих шагах:

  • Сначала используйте RegEx и match(), чтобы получить одномерный массив строк, таких как ["aaa","bbb",...].
  • Затем разделите длину этого массива на число групп, которые вы хотите создать, т.е. в этом случае 4. Давайте назовем это x
  • Затем используйте reduce() метод в массиве. И используйте [] в качестве начального значения аккумулятора.
  • Теперь элемент проверяется, если индекс текущего элемента модуля x, то push() его значение. В противном случае создайте пустой массив в этом месте.
let str = 'aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt'


let groups = str.match(/(.)\1+/g);
let x = groups.length/4;

let res = groups.reduce((ac,a,i) => {
  if(!ac[i%x]) ac[i%x] = [];
  ac[i%x].push(a);
  return ac;
},[]);

console.log(res)
4
Maheer Ali 3 Май 2019 в 14:14

Вы можете использовать Regex, чтобы разбить строку на маленькие массивы. затем map() и slice() большой массив на группы.

const str = 'aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt'
const lettersArr = str.match(/([a-z])\1*/g)
var chunkSize = 4;

const groups =  lettersArr.map( function(e,i){ 
     return i%chunkSize===0 ? lettersArr.slice(i,i+chunkSize) : null; 
}).filter((e) =>e);

console.log(groups);
0
Amit Baranes 3 Май 2019 в 14:24

Формула для получения индекса конкретной группы для данной пары x, y:

index = (x + (y * 5))*3;

5 Потому что у вас есть 5 столбцов. 3, потому что каждый столбец имеет ширину 3 символа.

Таким образом, начальный индекс столбца будет вашим индексом столбца × 3.

Затем вы захотите выяснить, насколько высока ваша матрица. Если вам гарантированы полные строки, то вы можете сказать, что высота равна длине строки ÷ 15. Это потому, что каждая строка имеет ширину 15 символов.

Таким образом, чтобы получить последний индекс вашего столбца, который вам нужен (индекс столбца + ((высота-1) × 5)) × 3).

(высота - 1), потому что у 0 проиндексировано.

Теперь у вас есть начальные и конечные индексы. Следующим шагом будет цикл по строке по ширине строки от начального индекса до конечного индекса, захват 3 символов по ходу и добавление 3 символов в массив.

0
Matt Ellen 3 Май 2019 в 14:00