You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:24:05