Javascript 将年数组分组为一个范围

Javascript 将年数组分组为一个范围,javascript,arrays,Javascript,Arrays,我尝试采用如下数组: [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=年。减少((acc、curr、idx)=>{ cons

我尝试采用如下数组:

[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=年。减少((acc、curr、idx)=>{
const prevYear=年[idx-1];
const nextYear=年[idx+1];
如果(!上一年){
acc.push(curr.toString());
返回acc;
}
如果(上一年===当前-1和下一年===当前+1){
如果(附件[附件长度-1]!='-'){
加速推力('-');
}
返回acc;
}否则{
acc.push(curr.toString());
如果(下一个){
加速推力(',');
}
返回acc;
}
返回acc;
}, []);
log(str.join(“”))
另一种方法(我认为这更容易概念化)是迭代范围,而不是数组中的项。查找项目时,请向前跟踪,直到不再存在连续的查找年份。如果发现连续超过一年,请添加该范围,否则只需添加一年:

const getRanges=(arr)=>{
const set=new set(arr);//以减少以后的计算复杂性
const min=Math.min(…arr);
const max=数学最大值(…arr);
常量输出=[];
for(设i=min;i

我创建了一个值数组,并将索引添加为二维数组,然后使用分隔符将它们连接起来。

使用传统的for循环,您可以编写:

const years = [1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010];
const sliceInterval = 5;
const summary = [];
let sliceCounter = 0;
let segment = "";

for (var i = 0; i < years.length; i++) {
    const currentYear = years[i];
    if (sliceCounter === 0) segment = currentYear + " - ";
    if (sliceCounter !== 0 && (i === years.length - 1 || sliceCounter % sliceInterval === 0)) {
        segment += currentYear;
        summary.push(segment);
        sliceCounter = 0;
        segment = "";
    } else sliceCounter++;
}

console.log(summary.join(", "));
const years=[1999、2000、2001、2002、2003、2004、2006、2008、2009、2010];
常数间隔=5;
const summary=[];
设sliceCounter=0;
让段=”;
对于(变量i=0;i
应该是这样的

const years=[1999、2001、2000、2002、2003、2004、2006、2008、2009、2010]
const getGroups=(年)=>{
常量组=[]
设lastYear=null;
让currentGroup={
from:null,
至:空
}
years.sort().forEach(year=>{
if(currentGroup.from==null){
currentGroup.from=年
currentGroup.to=年份
}else if(去年和去年+1==年){
currentGroup.to=年份
}否则{
if(currentGroup.to==null){
currentGroup.to=去年
}
groups.push(当前组)
当前组={
起始日期:年,
至:空
}
}
去年
})
groups.push(当前组)
返回组
}
常量打印组=(组)=>{
const groupsString=groups.map(group=>{
if(group.from==group.to)
返回`${group.from}`
其他的
返回`${group.from}-${group.to}`
}).join(“,”)
console.log(groupsString)
}
const groups=getGroups(年)
打印组(组)

这是否回答了您的问题?它只打印了“['1999'、'2001'、'2000'、'2002-2004'、'2006'、'2008-2010'”`
const years = [1999, 2000, 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010];
const sliceInterval = 5;
const summary = [];
let sliceCounter = 0;
let segment = "";

for (var i = 0; i < years.length; i++) {
    const currentYear = years[i];
    if (sliceCounter === 0) segment = currentYear + " - ";
    if (sliceCounter !== 0 && (i === years.length - 1 || sliceCounter % sliceInterval === 0)) {
        segment += currentYear;
        summary.push(segment);
        sliceCounter = 0;
        segment = "";
    } else sliceCounter++;
}

console.log(summary.join(", "));