Выполните итерацию и извлеките каждый элемент строки, значения которой разделены \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));

Другие вопросы по тегам