如何修改函数实现从数组返回5个尽可能等间距的有序元素?
解决方案
原函数的问题在于步长计算方式不合理,当数组长度为8或9时,Math.floor(array.length / 5)得到的步长为1,导致直接取前5个元素,无法实现等间距分布。要解决这个问题,我们需要从数组首尾两端开始,均匀选取中间元素,确保结果的索引在原数组中尽可能均匀分布,同时保持原顺序。
修改后的函数代码
function getEquallySpacedItems(array) { const targetCount = 5; // 数组长度小于等于目标数量时直接返回副本 if (array.length <= targetCount) { return [...array]; } const result = []; // 计算每个选取位置的间隔系数:(总长度-1)/(目标数量-1),保证首尾都被选中 const step = (array.length - 1) / (targetCount - 1); for (let i = 0; i < targetCount; i++) { // 计算当前元素的索引,用四舍五入保证最接近均匀分布的位置 const index = Math.round(step * i); result.push(array[index]); } return result; }
效果验证
- 当数组长度为8时(索引0-7):
计算得到的索引为0,2,4,5,7,结果数组保持原顺序,间隔尽可能均匀。 - 当数组长度为9时(索引0-8):
计算得到的索引为0,2,4,6,8,实现完美的等间距分布。 - 当数组长度为10时(索引0-9):
索引为0,2,5,7,9,间隔均匀且覆盖首尾。
核心思路
- 固定选中数组的第一个和最后一个元素,保证结果覆盖整个时间范围(对应预约场景的首尾时段)。
- 通过
(数组长度-1)/(目标数量-1)计算均匀分布的间隔系数,确保中间元素的位置尽可能平均。 - 用
Math.round()将计算出的浮点索引转换为最接近的整数索引,保证选取的元素在原数组中位置最优。
内容的提问来源于stack exchange,提问作者DDulla
相关产品推荐
相关产品推荐

