首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于持续时间字符串的数组分组

基于持续时间字符串的数组分组
EN

Stack Overflow用户
提问于 2022-08-30 17:06:30
回答 2查看 41关注 0票数 -1

我需要根据重叠期将元素分组到不同的容器中。假设我们有以下数组:

代码语言:javascript
运行
复制
const periods = ['1-4', '1-7', '1-4', '1-8', '1-8', '5-8', '9-12', '9-12'];

我需要它变成:

代码语言:javascript
运行
复制
[['1-4', '5-8', '9-12'], ['1-7', '9-12'], ['1-4'], ['1-8'], ['1-8']]

基本上,元素会被推入“行”。如果元素的周期与当前行中的另一个时间重叠,则会创建另一个。

在本例中,'1-4', '5-8' and '9-12'是分组的,因为它们的句点不重叠。

在使用DOM元素时,我使用数组来简化事情。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-30 22:42:50

也许这段代码能帮你解决你的案子。

代码语言:javascript
运行
复制
const periods = ["1-4", "1-7", "1-4", "1-8", "1-8", "5-8", "9-12", "9-12"];

const groupPeriods = (periods) => {
  const groups = {};
  const listOfPeriodsGlobal = [...periods];

  for (let i = 0; i < periods.length; i++) {
    const joinPeriods = [];
    const listOfPeriods = [...listOfPeriodsGlobal];

    for (let j = 0; j < listOfPeriods.length; j++) {
      if (isInRange(listOfPeriods[j], joinPeriods)) {
        joinPeriods.push(listOfPeriods[j]);
        listOfPeriodsGlobal.splice(j, 1);
      }
    }

    groups[i] = joinPeriods;
  }
  return groups;
};

const isInRange = (period, joinPeriods) => {
  let respose = true;
  for (let i = 0; i < joinPeriods.length; i++) {
    const range = joinPeriods[i];
    const rangesplited = range.split("-");
    const periodsplited = period.split("-");

    if (
      (parseInt(periodsplited[0]) >= parseInt(rangesplited[0]) &&
        parseInt(periodsplited[0]) <= parseInt(rangesplited[1])) ||
      (parseInt(periodsplited[1]) >= parseInt(rangesplited[0]) &&
        parseInt(periodsplited[1]) <= parseInt(rangesplited[1]))
    ) {
      respose = false;
    } else {
      response = true;
    }
  }

  return respose;
};

console.log(groupPeriods(periods));
票数 0
EN

Stack Overflow用户

发布于 2022-08-30 17:19:53

您可以通过检查开始值的最后一个值来找到组。

代码语言:javascript
运行
复制
const
    periods = ['1-4', '1-7', '1-4', '1-8', '1-8', '5-8', '9-12', '9-12'],
    groups = periods.reduce((r, p) => {
        const
            start = +p.split('-', 1),
            t = r.find(a => +a.at(-1).split('-')[1] < start);
            
        if (t) t.push(p);
        else r.push([p]);
        return r;
    }, []);

console.log(groups);
代码语言:javascript
运行
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73546172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档