Quebrando por partes:
str.replace(/[,]/g, _ => ++index % 2 === 0 ? '#' : ',')
/[,]/g
é uma expressão regular (regex) que significa “uma vírgula” (e que poderia ser apenas /,/g
) e o replace
serve para substituir as ocorrências de vírgula por alguma outra coisa (o g
diz para substituir todas as vírgulas - sem ele, somente a primeira seria substituída).
Essa “outra coisa” que substituirá a vírgula é dada pela função _ => ++index % 2 === 0 ? '#' : ','
, que basicamente incrementa o valor de index
, verifica se é par (e se for, substitui a vírgula por #
, senão, substitui por uma vírgula - ou seja, troca uma vírgula sim, outra não). O resultado desse replace
é a string 1,2#3,4#5,6
.
Depois o split('#')
separa a string em partes, usando o #
como separador, então teremos um array com 3 strings: [ '1,2', '3,4', '5,6' ]
.
Por fim, o map
aplica uma função a cada um dos elementos deste array. No caso, ele pega cada uma das 3 strings acima, faz outro split
(mas agora separando pela vírgula), e transforma cada elemento em número. O resultado é que cada string vira um novo array, contendo os números antes e depois da vírgula: [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]
.
Só pra constar, acho esse código desnecessariamente complicado. Dá pra fazer de forma mais simples (e também mais rápida, por não usar regex nem ficar chamando vários callbacks - que são as funções chamadas por replace
e map
- aliás, segue aqui o teste que fiz, e a solução abaixo é muito mais rápida).
Basicamente, dá pra fazer um único split
separando pela vírgula, e aí pega os números de 2 em 2:
const str = '1,2,3,4,5,6';
let partes = str.split(',');
let result = [];
for (var i = 0; i < partes.length; i += 2) {
result.push([ parseInt(partes[i]), parseInt(partes[i + 1])]);
}
console.log(result);
Em Java basta fazer a mesma lógica (assumindo que a string sempre tem uma quantidade par de números):
String s = "1,2,3,4,5,6";
String[] partes = s.split(",");
int[][] result = new int[partes.length / 2][2];
for (int i = 0; i < partes.length; i += 2) {
result[i / 2] = new int[] { Integer.parseInt(partes[i]), Integer.parseInt(partes[i + 1]) };
}
System.out.println(Arrays.deepToString(result)); // [[1, 2], [3, 4], [5, 6]]