我需要从一个数组中返回一个包含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个数组项目。
我希望这有道理吗?它几乎就像一个数组块,但只来自数组索引,而不是我想要返回的数组量。
谢谢!
答案 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);