Google Apps Script是否有等同于参数为TRUE的MATCH()的内置函数?
实现类Sheets MATCH(type=1)的升序数组模糊查找方案
首先明确适用前提:该方案仅适配已按升序完成排序的数组,和Sheets MATCH函数设置排序类型为1/TRUE时的要求完全一致,乱序数组使用会返回不符合预期的结果。
核心结论
JavaScript 没有内置原生API直接支持该查找逻辑,但你不需要使用O(n)复杂度的逐元素遍历,用二分查找可以实现O(logn)的查找效率,长数组场景下性能优势非常明显。
二分查找实现(推荐)
/** * 等效于Sheets MATCH(searchValue, sortedArray, 1) * @param {number} searchValue 待搜索的值 * @param {number[]} sortedArray 已升序排序的数组 * @returns {number} 小于等于搜索值的最大元素的索引,搜索值小于所有元素时返回-1 */ function matchAsc(searchValue, sortedArray) { let left = 0; let right = sortedArray.length; while (left < right) { const mid = Math.floor((left + right) / 2); if (sortedArray[mid] > searchValue) { right = mid; } else { left = mid + 1; } } return left - 1; }
效果验证
// 你给出的示例 matchAsc(35, [10,20,30,40]) // 返回2,符合预期 // 边界场景测试 matchAsc(5, [10,20,30,40]) // 返回-1,搜索值小于所有元素 matchAsc(50, [10,20,30,40]) // 返回3,搜索值大于所有元素 matchAsc(30, [10,20,30,40]) // 返回2,精确匹配
短数组简易遍历实现
如果你的数组长度普遍在20以内,写简单遍历的代码更简洁,性能差异可以忽略不计:
function matchAscSimple(searchValue, sortedArray) { for (let i = 0; i < sortedArray.length; i++) { if (sortedArray[i] > searchValue) return i - 1; } return sortedArray.length - 1; }
内容的提问来源于stack exchange,提问作者Atiq Zabinski
相关产品推荐
相关产品推荐

