【问题标题】:Iterate over and fetch each element of string having values separated by \n delimiter without using split迭代并获取字符串的每个元素,其值由 \n 分隔符分隔,而不使用 split
【发布时间】:2018-03-01 07:49:10
【问题描述】:

我有一个输入字符串,例如

1
29
315
4597
5
6

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

有没有一种方法可以在不生成此类数字的数组并直接从字符串本身中单独提取这些数字及其索引的情况下获取这些元素?

【问题讨论】:

  • 没有。拆分 -> 迭代是人们通常会这样做的方式。没有 "Iterate over specific parts of this string" 方法。
  • split() 是实现这一目标的最佳方式。你不想创建一个数组吗?有什么具体问题吗?
  • 不确定我想实现这个 SO 回复中提到的最好方法,我在我的questions 之一上得到了这个回复
  • @TGW:是什么让你认为使用split?对我来说,这似乎是正是所使用的。
  • @Cerbrus 我相信他们没有像明确提到的那样创建一个数组,他们不希望它被加载到内存中,split 确实返回了一个数组。 ES 也是用 java 开发的,所以他们没有那种方法,但我只是想知道是否有一种工作方法更快但不好,可能是因为这种工作方法可能有一些其他更昂贵和不需要的影响

标签: javascript arrays string csv


【解决方案1】:

您可以编写一个生成器函数,将源字符逐个字符循环,并在找到换行符后生成一行:

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)

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

【讨论】:

  • 手动迭代每个字符是否比 split 快​​?
  • 可能不会,但是这个生成器也可以在 .split 不能使用的情况下工作 - 例如当source 是一个太大而无法一次读取的流时。
【解决方案2】:

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

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));

【讨论】:

  • 可维护性很好。
猜你喜欢
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2023-02-25
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多