如何基于结果数组筛选主数组并获取相邻边界元素?
解决方案:动态筛选主数组并包含区间前后相邻元素
看起来你已经摸到了核心的区间筛选逻辑,只差一步——把区间在主数组里的前后相邻元素也纳入结果对吧?这里给你一个完全动态的解决方案,适配所有升序有序的主数组场景:
思路拆解
- 先正确计算结果数组的最小和最大值(注意
Math.min()/Math.max()需要展开数组元素,不能直接传数组) - 在主数组中定位区间的起始边界:如果区间最小值在主数组中有匹配项,就取它的前一个元素(如果存在);如果区间最小值比主数组第一个元素还小,就从第一个元素开始
- 定位区间的结束边界:如果区间最大值在主数组中有匹配项,就取它的后一个元素(如果存在);如果区间最大值比主数组最后一个元素还大,就到最后一个元素结束
- 截取主数组中从起始边界到结束边界的所有元素
代码实现
var master = [0,2,4,6,8,10]; var result = [4,5,6]; // 1. 计算结果数组的最小和最大值(用展开运算符处理数组参数) const minResult = Math.min(...result); const maxResult = Math.max(...result); // 2. 找到主数组中第一个 >= 结果最小值的元素索引 let startIndex = master.findIndex(num => num >= minResult); // 如果不是第一个元素,起始索引往前移一位 if (startIndex > 0) { startIndex--; } // 3. 找到主数组中最后一个 <= 结果最大值的元素索引 let endIndex = master.findLastIndex(num => num <= maxResult); // 如果不是最后一个元素,结束索引往后移一位 if (endIndex < master.length - 1) { endIndex++; } // 4. 截取主数组得到最终结果(slice结束索引是排他的,所以要+1) var finalmaster = master.slice(startIndex, endIndex + 1); console.log(finalmaster); // 输出: [2,4,6,8]
边界情况测试
- 若结果数组最小值小于主数组第一个元素:比如
result = [-1, 2],最终会得到[0,2,4] - 若结果数组最大值大于主数组最后一个元素:比如
result = [8, 12],最终会得到[6,8,10] - 若结果数组覆盖主数组全部范围:比如
result = [0,10],最终结果还是完整的主数组
这个方案完全动态,不管主数组元素间隔是多少,只要是升序有序数组就能正常工作~
内容的提问来源于stack exchange,提问作者Niyaz
相关产品推荐
相关产品推荐

