【问题标题】:Summarizing a list of Channels总结频道列表
【发布时间】:2021-12-28 04:57:58
【问题描述】:

这是我遇到的问题:

转这个字符串输入: "Ch 471: PRO BM R #5,Ch 472: PRO BM R #4,Ch 473: PRO BM R #3,Ch 481: PRO BM L # 5,Ch 482: PRO BM L #4,Ch 484: PRO BM L #3"

进入这个字符串输出: Ch 471-473: PRO BM R #3-5 Ch 481-484: PRO BM L #3-5

我试图在 JavaScript 中编写一个函数,该函数本质上是过滤一串由 x 数量的逗号分隔的通道,然后以上述格式总结它们。在上面的示例中,有 6 个具有位置和单位的不同通道。

决定/分组因素是位置(在上面的示例中,PRO BM R 和 PRO BM L) - 因此在一个位置上找到所有通道和单元,然后总结该信息。

这里有关于命名法的详细信息:

  • 频道 = Ch 471
  • 职位 = PRO BM R
  • 单位 = #5

到目前为止我已经尝试过,我假设我需要做的是使用几个循环来split() 数据

  • 以逗号开头
  • 然后通过:
  • 然后是#号

然后将数据推送到3个不同的数组中

  1. 通道阵列
  2. 位置数组
  3. 单位数组

然后过滤每个数组以找到唯一值、最大值等。但我无法解决这个问题?

欢迎任何指针、示例代码或任何类型的帮助!

【问题讨论】:

    标签: javascript summarize


    【解决方案1】:

    我认为使用正则表达式可以帮助您更好地分离组件:Ch (?<channel>\d+): (?<position>(?:\w|\s)+) #(?<units>\d+)

    以下是解析文本的起点:

    const regex = /Ch (?<channel>\d+): (?<position>(?:\w|\s)+) #(?<units>\d+)/g;
    
    const inputString = "Ch 471: PRO BM R #5,Ch 472: PRO BM R #4,Ch 473: PRO BM R #3,Ch 481: PRO BM L #5,Ch 482: PRO BM L #4,Ch 484: PRO BM L #3";
    
    const groups = {};
    
    [...inputString.matchAll(regex)].forEach(a => (groups[a.groups.position] ||= []).push({ channel: +a.groups.channel, units: +a.groups.units }));
    
    console.log(groups);

    然后您可以操作这些数据来创建一个字符串。

    【讨论】:

    • 是的!这是超级超级有用!仍在弄清楚如何运行您创建的那个对象,但这是一个很好的开始!在将对象转换为数组以开始解析正则表达式创建的对象后,您会尝试在对象上使用 forEach() 循环吗?
    • 感谢您的帮助!一个问题 - 在您的代码中 [...inputString 。 . . ] 部分你有一个||=,这在我运行它的一个环境中给了我一个错误。你知道发生了什么吗?
    • @ScottWeir 是的,您可以尝试使用 forEach,或者尝试任何可行的方法来达到您想要的结果;还有a ||= b是新语法,你可以用a || (a = b)替换它
    • 有趣 - 我确实完成了我的项目并且得到了预期的结果,除了新的语法仍然读作错误。即使我用等效的旧语法替换它,我也会收到错误:error: Uncaught TypeError: (groups[a.groups.position] || (groups[a.groups.position] === [])).push 是不是函数
    • 这是一个单一的= 标志
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2021-12-01
    • 2012-10-24
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多