javascript: 积分充值一类的数组邻近值相似值匹配算法
发布时间:2022-05-18 11:13 星期三
在平时,咱们只需要普通数组邻近值算法即可,但是如果是在积分充值一类的业务中,是需要优先取大于的情况,因为小于的情况,用户充值的意义不大,所以大部分需要优先判断大于的情况,故写了一个可供大家直接使用的简单算法,时间复杂度及空间复杂度都是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,
}
}