在平时,咱们只需要普通数组邻近值算法即可,但是如果是在积分充值一类的业务中,是需要优先取大于的情况,因为小于的情况,用户充值的意义不大,所以大部分需要优先判断大于的情况,故写了一个可供大家直接使用的简单算法,时间复杂度及空间复杂度都是n,只存在一次for循环

/**
 *  积分临近值算法
 *  1. 优先取大于当前值的相邻值
 *  2. 没有大于的,才取小于时最临近的值
 */
const fuzzyValueFixedItem = (value: number, data: number[]) => {
  let greater = {
    index: 0,
    value: Number.MAX_VALUE,
  }
  let less = {
    index: 0,
    value: Number.MAX_VALUE,
  }
  for (let i = 0; i < data.length; i += 1) {
    const newValue = Number(data[i]) - Number(value)
    const newAbsoluteValue = Math.abs(newValue)
    // 等于情况直接赋值
    if (newValue == 0) {
      greater = {
        index: i,
        value: newValue,
      }
      break
    }
    // 大于情况,数据存储
    if (newValue > 0 && newValue < greater.value) {
      greater = {
        index: i,
        value: newValue,
      }
    }
    // 小于情况,数据存储
    if (newAbsoluteValue < less.value) {
      less = {
        index: i,
        value: newAbsoluteValue,
      }
    }
  }
  // !1. 优先取大于当前值的相邻值
  if (greater.value < Number.MAX_VALUE) {
    /** 数组中的对象 */
    const fuzzyItem = data[greater.index]
    /** 所处的充值行数 */
    const fuzzyLine = greater.index
    return {
      fuzzyItem,
      fuzzyLine,
    }
  }
  // !2. 没有大于的,才取小于时最临近的值
  /** 数组中的对象 */
  const fuzzyItem = data[less.index]
  /** 所处的充值行数 */
  const fuzzyLine = greater.index
  return {
    fuzzyItem,
    fuzzyLine,
  }
}