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



我需要返回一个新的数组,在数组内给定索引的两侧各有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;
}

'19:00'看起来不错,返回:

["18:30", "18:45", "19:00", "19:15", "19:30"]

'17: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 i = times.indexOf(givenTime),
        start = i - 2,
        end = i + 3;
    if (start < 0) {
        start = 0;
        end = 5;
    }
    if (end > times.length) {
        end = times.length;
        start = end - 5;
    }
    return times.slice(start, end);
}
const times = ['17:30', '17:45', '18:00', '18:15', '18:30', '18:45', '19:00', '19:15', '19:30', '19:45', '20:00'];
 
console.log(getNearestTimes(times, '19:00'));
console.log(getNearestTimes(times, '17:45'));
console.log(getNearestTimes(times, '20:00'));

上面的一些较短的代码,重点是开始。

function getNearestTimes(times, givenTime) {
    var i = times.indexOf(givenTime) - 2;
    i = Math.min(Math.max(0, i), times.length - 5)
    return times.slice(i, i + 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'];
 
console.log(getNearestTimes(times, '19:00'));
console.log(getNearestTimes(times, '17:45'));
console.log(getNearestTimes(times, '20:00'));

试试这个:

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);
    }

如果给定时间在数组中不存在-将返回前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);

最新更新