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