Javascript 选择数组中给定索引两侧最近的2个元素

Javascript 选择数组中给定索引两侧最近的2个元素,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我需要从一个数组中返回一个新数组,该数组在给定索引的两侧各有2个项 考虑以下时间序列: const times = ['17:30', '17:45', '18:00', '18:15', '18:30', '18:45', '19:00', '19:15', '19:30', '19:45', '20:00']; 我需要能够做的是选择数组项,比如说,索引5,然后返回该项,以及两侧的2。这很简单,但是,如果给我一个1或0的索引,甚至是数组长度的末尾,我的代码就不能工作我总是想退回5件物品 考虑

我需要从一个数组中返回一个新数组,该数组在给定索引的两侧各有2个项

考虑以下时间序列:

const times = ['17:30', '17:45', '18:00', '18:15', '18:30', '18:45', '19:00', '19:15', '19:30', '19:45', '20:00'];
我需要能够做的是选择数组项,比如说,索引5,然后返回该项,以及两侧的2。这很简单,但是,如果给我一个1或0的索引,甚至是数组长度的末尾,我的代码就不能工作我总是想退回5件物品

考虑到目前为止我所拥有的以下(非常粗糙的)代码:

const times = ['17:30', '17:45', '18:00', '18:15', '18:30', '18:45', '19:00', '19:15', '19:30', '19:45', '20:00'],
      givenTime = '19:00';

console.clear();
console.log(getNearestTimes(times, givenTime));

function getNearestTimes(times, givenTime) {

   const nearestTimes = times.filter((element, index, array) => {
     const selected = array.indexOf(givenTime);
     const diffBefore = array.slice(0, selected).length,
         diffAfter = (diffBefore >= 2) ? 2 : (diffBefore + 4);

     if ((index >= (selected - diffAfter) && index < selected) || (index >= selected && index <= (selected + diffAfter)) ) {
       return element;
     }

   });

  return nearestTimes;

}
“17:30”看起来不错,返回:

["18:30", "18:45", "19:00", "19:15", "19:30"]
["17:30", "17:45", "18:00", "18:15", "18:30"]
但是,“19:45”看起来不太好,返回:

["19:15", "19:30", "19:45", "20:00"]
…理想情况下,“19:45”将返回:

["19:00", "19:15", "19:30", "19:45", "20:00"]
如果在给定时间之后没有足够的项目,我希望在该时间之前返回更多项目,以便始终返回5个数组项目

我希望这有意义?它几乎就像一个数组块,但只来自数组索引,而不是我想要返回的数组数量

谢谢大家!

试试这个:

function getNearestTimes(times, givenTime) {
        var index = times.indexOf(givenTime);
        index = index < 2 ? 2 : index > times.length -3 ? times.length -3 : index;
        return times.slice(index-2, index+3);
    }
函数getNearestTimes(次数,给定时间){
var指数=倍指数(给定时间);
指数=指数<2?2:指数>倍。长度-3?倍。长度-3:指数;
返回次数。切片(索引-2,索引+3);
}
如果数组中不存在givenTime-将返回前5项。

尝试以下操作:

function getNearestTimes(times, givenTime) {
        var index = times.indexOf(givenTime);
        index = index < 2 ? 2 : index > times.length -3 ? times.length -3 : index;
        return times.slice(index-2, index+3);
    }
函数getNearestTimes(次数,给定时间){
var指数=倍指数(给定时间);
指数=指数<2?2:指数>倍。长度-3?倍。长度-3:指数;
返回次数。切片(索引-2,索引+3);
}

如果数组中不存在给定时间-将返回前5项。

您可以通过一些检查更正开始和结束索引

函数getNearestTimes(次数,给定时间){
var i=倍指数(给定时间),
start=i-2,
结束=i+3;
如果(开始<0){
开始=0;
结束=5;
}
如果(结束>时间长度){
结束=乘以长度;
开始=结束-5;
}
返回次数。切片(开始、结束);
}
常数时间=['17:30','17:45','18:00','18:15','18:30','18:45','19:00','19:15','19:30','19:45','20:00'];
log(getnearestimes(times,'19:00');
log(getnearestimes(times,'17:45');

log(getnearestimes(times,'20:00')您可以通过一些检查来更正开始索引和结束索引

函数getNearestTimes(次数,给定时间){
var i=倍指数(给定时间),
start=i-2,
结束=i+3;
如果(开始<0){
开始=0;
结束=5;
}
如果(结束>时间长度){
结束=乘以长度;
开始=结束-5;
}
返回次数。切片(开始、结束);
}
常数时间=['17:30','17:45','18:00','18:15','18:30','18:45','19:00','19:15','19:30','19:45','20:00'];
log(getnearestimes(times,'19:00');
log(getnearestimes(times,'17:45');
log(getnearestimes(times,'20:00')您也可以尝试以下方法:

function getNearestTimes(times, time, count){         
     var lb = Math.max(times.indexOf(time)-Math.floor(count/2), 0);
     var ub = Math.min(times.indexOf(time)+Math.floor(count/2), times.length - 1);

     var range = (ub - lb) + 1;
     var delta = (count - range);         

     if (delta > 0 && ub === times.length - 1) {
         lb -= delta;
     }
     else if (delta > 0 && lb === 0) {
         ub += delta;
     }

     return times.slice(lb, ub + 1);
}


getNearestTimes(times, '17:30', 5);
getNearestTimes(times, '18:30', 5);
你也可以试试这个:

function getNearestTimes(times, time, count){         
     var lb = Math.max(times.indexOf(time)-Math.floor(count/2), 0);
     var ub = Math.min(times.indexOf(time)+Math.floor(count/2), times.length - 1);

     var range = (ub - lb) + 1;
     var delta = (count - range);         

     if (delta > 0 && ub === times.length - 1) {
         lb -= delta;
     }
     else if (delta > 0 && lb === 0) {
         ub += delta;
     }

     return times.slice(lb, ub + 1);
}


getNearestTimes(times, '17:30', 5);
getNearestTimes(times, '18:30', 5);

检查索引是否在两端的2范围内,并将差异添加到另一端?我尝试过这种方法,但因为我始终希望返回5个项目,所以如果前后没有足够的项目,我需要一种方法来填充它。等等,如果数组中只有4个项目可以开始,您想做更多吗?您是要补足它们(字符串遵循示例中的模式)还是返回
undefined
null
?如果是的话,新的物品会放在哪一边?理想情况下,如果只有4件物品,那么只返回4件物品。抱歉,我应该澄清这一点。检查索引是否在两端的2范围内,并将差异添加到另一端?我已经尝试过这种方法,但因为我始终希望返回5项,所以如果前后没有足够的项,我需要一种方法来填充。等等,如果数组中只有4项开始,你想赚更多吗?您是要补足它们(字符串遵循示例中的模式)还是返回
undefined
null
?如果是的话,新的物品会放在哪一边?理想情况下,如果只有4件物品,那么只返回4件物品。对不起,我应该澄清这一点。现在我在这里看到它是如此简单。干得好!这正是我想要的谢谢。我开始变得有点太复杂了,我相信这正是我开始困惑自己的原因。基本上和我的答案一样,只是我选择了三元运算符而不是if语句。代码更少。现在我在这里看到它是如此简单。干得好!这正是我想要的谢谢。我开始变得有点太复杂了,我相信这正是我开始困惑自己的原因。基本上和我的答案一样,只是我选择了三元运算符而不是if语句。更少的代码。