【问题标题】:JavaScript - multidimensional array needed?JavaScript - 需要多维数组?
【发布时间】:2020-02-07 07:34:44
【问题描述】:

我有一个看起来像这样的字符串:

PRE_VALUE1="TIMESTAMP" PRE_VALUE2="String13" PRE_VALUE3=""PRE_VALUE4="1" PRE_VALUE5="AK" PRE_VALUE6="key6" POST_VALUE1="000" VALUE8="KE_Y1" PRE_VALUE9="" PRE_VALUE10="10.10.10.10" ....

我的目标是在每个PRE_VALUE# 的第二个引号之后分割字符串。之后,我想构建一个 simple RegExp 来检查 PRE_VALUE# 的引号中是否包含某些内容。

上面的部分对我来说几乎是清楚的。我将使用 split-Method - 这是我的问题,我不确定如何告诉 split-Method 它应该在第二个引号而不是第一个引号处拆分字符串。

但是,我真正担心的是,如果拆分后的值与 RexExp 匹配到变量,我想分配它们。在将它们分配给该变量之前,应该有一个简单的词来解释该字段。 例如:

PRE_VALUE2="String13" 将是“String: String13”。

如果我理解正确的话,最好和最快的方法是在这里使用多维数组。由于有许多这样的消息,并且“PRE_VALUE#”只能通过正则表达式构建完整的输入字符串应该有点慢,对吗?

也许有人可以在这里帮助我。

提前致谢!

【问题讨论】:

  • 使用 split 函数不可能分割彼此的引号,但您当然可以分割引号并将结果数组中的偶数索引“n”视为变量名,奇数索引“n+1”变量值。使用正则表达式当然有更好的方法,但我仍然不太擅长这些......

标签: javascript arrays performance


【解决方案1】:

除了使用正则表达式过滤掉PRE_VALUEx 值之外,您还可以将string 拆分为空格,然后拆分为=,以在array 中获取所有相关的values,如下所示:

[ [ "PRE_VALUE1", “时间戳”],[ "PRE_VALUE2", “字符串 13”]、[ "PRE_VALUE3", ""], [ "PRE_VALUE4", “1”],[ "PRE_VALUE5", “AK”],[ "PRE_VALUE6", “key6”],[ "POST_VALUE1", “000”],[ "VALUE8", “KE_Y1”],[ "PRE_VALUE9", ""], [ "PRE_VALUE10", “10.10.10.10”]]

代码应该是这样的:

var arr = string.split("\" ").map(x => {
  x = x.replace(/\"/g, '');
  return x.split("=");
});

演示:

let string = `PRE_VALUE1="TIMESTAMP" PRE_VALUE2="String13" PRE_VALUE3="" PRE_VALUE4="1" PRE_VALUE5="AK" PRE_VALUE6="key6" POST_VALUE1="000" VALUE8="KE_Y1" PRE_VALUE9="" PRE_VALUE10="10.10.10.10"`;

var arr = string.split("\" ").map(x => {
  x = x.replace(/\"/g, '');
  return x.split("=");
});
console.log(arr);

【讨论】:

  • 如果空格在引号内怎么办?
  • 在这种情况下,我们将按" 进行拆分,以确保按相关空格进行拆分。
  • 有没有办法改变前缀,例如返回字符串时是否包含“PRE_VALUE1”?并且还将每个返回值保存在一个单独的变量中,以便我可以例如记录“var1 的值为 TIMESTAMP”和“var2 的值为 String13”?
  • @qwertzy 在这种情况下,不要返回return x.split("="),而是使用return x.split("=")[1] 仅获取数组中的值,然后您可以遍历数组并打印变量。
【解决方案2】:

您可以在引号内搜索不带引号的字符。

var string = 'PRE_VALUE1="TIMESTAMP" PRE_VALUE2="String13" PRE_VALUE3="" PRE_VALUE4="1" PRE_VALUE5="AK" PRE_VALUE6="key6" POST_VALUE1="000" VALUE8="KE_Y1" PRE_VALUE9="" PRE_VALUE10="10.10.10.10"',
    pairs = string
        .match(/[^\s=]+="[^"]*"/g)
        .reduce((r, s) => {
            var [, k, v] = s.match(/([^\s=]+)="([^"]*)"/);
            r[k] = v;
            return r;
        }, {});

console.log(pairs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

更直接的方法

var regex = /([^\s=]+)="([^"]*)"/gm,
    string = 'PRE_VALUE1="TIMESTAMP" PRE_VALUE2="String13" PRE_VALUE3="" PRE_VALUE4="1" PRE_VALUE5="AK" PRE_VALUE6="key6" POST_VALUE1="000" VALUE8="KE_Y1" PRE_VALUE9="" PRE_VALUE10="10.10.10.10"',
    pairs = {},
    m;

while ((m = regex.exec(string)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) regex.lastIndex++;

    let [, k, v] = m;
    pairs[k] = v;
}

console.log(pairs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 您好,感谢您的快速回复和帮助。解决方案对我来说看起来有点完美 - 有没有办法改变前缀,例如返回字符串时是否包含“PRE_VALUE1”?还要将每个返回值保存在单独的变量中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多