Выполните итерацию и извлеките каждый элемент строки, значения которой разделены \n разделителем, без использования split
У меня есть строка ввода, такая как
1
29
315
4597
5
6
Каждое число разделяется разделителем \ n, в обычных случаях я бы просто использовал метод split(), чтобы получить массив этих чисел, например: ["1","29","315","4597","5","6"]
и затем переберите массив, чтобы получить каждый элемент внутри него.
Есть ли способ извлечения этих элементов без генерации массива таких чисел и непосредственного извлечения этих чисел вместе с их индексами из самой строки?
2 ответа
Вы можете написать функцию генератора, которая зацикливает исходный символ на символ и выдает строку, как только находит символ новой строки:
function* lines(source) {
let buf = '';
for (let char of source) {
if (char === '\n') {
yield buf;
buf = '';
} else
buf += char;
}
if (buf)
yield buf;
}
source = `1
29
315
4597345345345
5
6`;
for (let line of lines(source))
console.log(line)
Если вам также нужны индексы во время работы, вы можете использовать эту простую утилиту:
function* enumerate(it, start = 0) {
for (let x of it)
yield [start++, x];
}
а потом
for (let [index, line] of enumerate(lines(source)))
console.log(index, line)
Обратите внимание, что "источник" не обязательно должен быть строкой, это может быть любой итеративный объект, например, файл, что удобно, когда ваши данные не могут быть сохранены в памяти сразу.
Попробуйте следующий подход. Это линейное время и не создает массивов.
let str = "0\r\n1\n22\n333\r\n4\n55\n6\n777\r\n8888\n99999";
const fetch = (str, index) => {
let i = 0, j = 0, value = "";
while (j < index && i < str.length) {
if (str[i++] === '\n') j++;
}
while (str[i] >= '0' && str[i] <= '9' && i < str.length) value += str[i++];
return value;
};
console.log(fetch(str, 7));