我需要根据重叠期将元素分组到不同的容器中。假设我们有以下数组:
const periods = ['1-4', '1-7', '1-4', '1-8', '1-8', '5-8', '9-12', '9-12'];
我需要它变成:
[['1-4', '5-8', '9-12'], ['1-7', '9-12'], ['1-4'], ['1-8'], ['1-8']]
基本上,元素会被推入“行”。如果元素的周期与当前行中的另一个时间重叠,则会创建另一个。
在本例中,'1-4', '5-8' and '9-12'
是分组的,因为它们的句点不重叠。
在使用DOM元素时,我使用数组来简化事情。有什么想法吗?
发布于 2022-08-30 22:42:50
也许这段代码能帮你解决你的案子。
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));
发布于 2022-08-30 17:19:53
您可以通过检查开始值的最后一个值来找到组。
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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
https://stackoverflow.com/questions/73546172
复制相似问题