我正在尝试采用这样的数组:
[1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010]
Run Code Online (Sandbox Code Playgroud)
并使其输出:
1999 - 2004, 2006, 2008 - 2010
这似乎是一个简单的任务,但似乎做对了。我假设这Array.reduce是正确的工具:
[1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010]
Run Code Online (Sandbox Code Playgroud)
我快到了,但我正尝试使它看起来尽可能整洁而没有一堆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]));Run Code Online (Sandbox Code Playgroud)
使用reduce此处的一个问题是,除了acc输出数组之外,您还需要跟踪其他状态(到目前为止连续范围内的项数及其值),如果您尝试这样做的话,它会变得非常混乱将所有内容封装在reduce回调中。可以这样做,但我不建议这样做。
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |