我有一个输入字符串,如
1
29
315
4597
5
6
每个数字都用\ n分隔符分隔,在常规情况下我要做的就是使用split()方法获取这些数字的数组,如["1","29","315","4597","5","6"]
,然后遍历数组以获取其中的每个元素。
有没有办法获取这些元素而不生成这样的数字数组,并直接从字符串本身单独拉出这些数字及其索引?
您可以编写一个生成器函数,通过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”不必是字符串,它可以是任何可迭代对象,例如一个文件,当你的数据不能一次保存在内存中时这是实用的。
尝试以下方法。它是线性时间,不会创建数组。
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));