迭代并获取字符串的每个元素,其值由\ n分隔符分隔,而不使用拆分

问题描述 投票:0回答:2

我有一个输入字符串,如

1
29
315
4597
5
6

每个数字都用\ n分隔符分隔,在常规情况下我要做的就是使用split()方法获取这些数字的数组,如["1","29","315","4597","5","6"],然后遍历数组以获取其中的每个元素。

有没有办法获取这些元素而不生成这样的数字数组,并直接从字符串本身单独拉出这些数字及其索引?

javascript arrays string delimiter-separated-values
2个回答
1
投票

您可以编写一个生成器函数,通过char循环源char,并在找到换行符号后生成一行:

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)

注意,“source”不必是字符串,它可以是任何可迭代对象,例如一个文件,当你的数据不能一次保存在内存中时这是实用的。


0
投票

尝试以下方法。它是线性时间,不会创建数组。

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));
© www.soinside.com 2019 - 2024. All rights reserved.