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

时间:2016-10-10 11:13:05

标签: 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件

考虑我到目前为止的以下(非常粗略)代码:

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个数组项目。

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

试试这个:

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

如果数组中不存在givenTime,则返回前5个项目。

答案 2 :(得分:1)

你也可以试试这个:

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