//二分法搜索范围,返回 [start,end] 或者 index function findScope(str,hasSortArr,callback) { var lm,rm; var l=0,r=hasSortArr.length; var has=false; while(l<r){ const m=(l+r)>>1; //比较下坐标大小 const dis=callback(str,hasSortArr[m]) if(dis>0){ l=Math.max(m,l+1) }else if(dis<0){ r=Math.min(m,r-1) }else{ lm=l; rm=r; l=r=m has=true; } } if(has){ while (lm<l){ const m=(l+lm)>>1; //比较下坐标大小 const dis=callback(str,hasSortArr[m]) if(dis>0){ lm=Math.max(m,lm+1) }else{ l = Math.min(m, l - 1) } } while (rm>r){ const m=(r+rm)>>1; //比较下坐标大小 const dis=callback(str,hasSortArr[m]) if(dis<0){ rm=Math.min(m,rm-1) }else { r = Math.max(m, r + 1) } } return [l,r]; } return l } const index=findScope(10,[1,3,4,4,4,5],function (p1,p2) { return p1-p2 }) console.log(index)