gpt4 book ai didi

javascript - 将年份数组分组到一个范围内

转载 作者:行者123 更新时间:2023-12-03 16:41:30 25 4
gpt4 key购买 nike

我正在尝试采用这样的数组:

[1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010]

并使其输出:

1999 - 2004, 2006, 2008 - 2010

这似乎是一项简单的任务,但似乎无法正确完成。我假设 Array.reduce 是正确的工具:

const years = [1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010];
const str = years.reduce((acc, curr, idx) => {
const prevYear = years[idx - 1];
const nextYear = years[idx + 1];
if (!prevYear) {
acc.push(curr.toString());
return acc;
}
if (prevYear === curr - 1 && nextYear === curr + 1) {
if (acc[acc.length - 1] !== '-') {
acc.push('-');
}
return acc;
} else {
acc.push(curr.toString());
if (nextYear) {
acc.push(',');
}
return acc;
}
return acc;
}, []);
console.log(str.join(''))

我快到了,但我试图让它看起来尽可能干净,而不需要一堆 if 语句。

我知道我可以走穷人路线,只需运行 str.replace(',-', '-') 来解决我的最后一个小障碍,但我没有'不喜欢那样。

最佳答案

另一种选择(我认为它更容易概念化)是迭代 范围 而不是数组中的项目。查找项目时,向前追踪,直到不再存在连续找到的年份。如果连续发现超过一年,则添加该范围,否则只需添加一年:

const getRanges = (arr) => {
const set = new Set(arr); // for less computational complexity later
const min = Math.min(...arr);
const max = Math.max(...arr);
const output = [];
for (let i = min; i <= max; i++) {
if (!set.has(i)) {
continue;
}
const thisMin = i;
while(set.has(i)) {
i++;
}
output.push(i === thisMin + 1 ? thisMin : `${thisMin} - ${i - 1}`);
}
return output;
};
console.log(getRanges([1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010]));

在此处使用 reduce 的一个问题是您需要跟踪 additional state(目前为止连续范围内的项目数,以及它们的值)而不是 acc 输出数组,如果您试图将所有内容封装在 reduce 回调中,它会变得真的 困惑。有可能,但我不建议这样做。

关于javascript - 将年份数组分组到一个范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58869552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com