У меня есть некоторые входные данные, которые выглядят так:

2
2 2
2
2 0
0 5
3 3
3 5
1 1 1
3 0 0
1 10 0

С (иногда) дополнительным переводом строки в конце. Я разбил эти данные на массив чисел, используя var b = this.data.replace(/\n/g, " ").split(/[\s,]+/).map(Number);, где указанные выше данные хранятся в this.data. и b - новый массив. Когда в конце нет новой строки, это работает нормально. Однако, если у меня есть символ новой строки в конце, я получаю дополнительный 0 в конце. Кажется, что происходит следующее:

  • \n символы заменяются пробелами
  • список разбит на пробелы - когда в конце есть \n, в конце этого списка есть (пустой) элемент
  • map(Number) интерпретирует последний (пустой) элемент как 0.

Как я могу предотвратить это?

0
Luciano 3 Май 2019 в 00:13

3 ответа

Лучший ответ

trim () перед строкой работая с этим

Метод trim () удаляет пробелы с обоих концов строки. Пробел в этом контексте - это все символы пробела (пробел, табуляция, неразрывный пробел и т. Д.) И все символы конца строки (LF, CR и т. Д.).

const str = `
2
2 2
2
2 0
0 5
3 3
3 5
1 1 1
3 0 0
1 10 0
`

const result = str.trim().split(/\s|\n/).map(Number)

console.log(result)
1
Get Off My Lawn 2 Май 2019 в 21:25

Подберите последовательность цифр и сопоставьте их с числами:

const str = `
2
2 2
2
2 0
0 5
3 3
3 5
1 1 1
3 0 0
1 10 0
`

const result = str.match(/\d+/g).map(Number)

console.log(result)
2
Ori Drori 2 Май 2019 в 21:22

Одним из возможных решений является использование Array.filter ( ) до .map()

const str = `
2
2 2
2
2 0
0 5
3 3
3 5
1 1 1
3 0 0
1 10 0

`

const result = str.split(/\n|\s/).filter(Boolean).map(Number);
console.log(result);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Однако эту задачу также можно выполнить с помощью строки. .match ( )

const str = `
2
2 2
2
2 0
0 5
3 3
3 5
1 1 1
3 0 0
1 10 0

`

const result = str.match(/\d+/g).map(Number);
console.log(result);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Или хитрым способом, используя функция замены String.replace ( ).

const str = `
2
2 2
2
2 0
0 5
3 3
3 5
1 1 1
3 0 0
1 10 0

`
let result = [];
str.replace(/\d+/g, m => (result.push(+m), m));
console.log(result);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0
Shidersz 2 Май 2019 в 21:38