javascript - 一种在 JavaScript 数组中查找最接近值的算法

标签 javascript arrays

我正在研究一种小型算法,用于在随机数字数组中查找给定数字的最接近值。就我而言,我正在尝试检测由 6 位数字 ID(“123456”、“0078965”等)标识的已连接计算机,但它可能很有用,例如查找我周围最近的地理定位用户。

我需要的是列出 5 台最近的机器,无论它们的 ID 是更高还是更低。这段代码工作完美,但我正在寻找一种更智能、更好的方法来继续,我有很多循环和数组。

let n = 0; // counter
let m = 5; // number of final machines to find

// list of IDs founded (unordered: we can't decide)
const arr = ["087965","258369","885974","0078965","457896","998120","698745","399710","357984","698745","789456"] 
let NUM = "176789" // the random NUM to test

const temp = [];
const diff = {};
let result = null;

// list the [m] highest founded (5 IDs)
for(i=0 ; i<arr.length; i++) {
    if(arr[i] > NUM) {
        for(j=0 ; j<m; j++) {
            temp.push(arr[i+j]);
        } break;
    }
}

// list the [m] lowest founded (5 IDs)
for(i=arr.length ; i>=0; i--) {
    if(arr[i] < NUM) {
        for(j=m ; j>=0; j--) {
            temp.push(arr[i-j]);
        } break;
    }
}

// now we are certain to get at least 5 IDs even if NUM is 999999 or 000000

temp.sort(function(a, b){return a - b}); // increase order

for(i=0 ; i<(m*2); i++) {
    let difference = Math.abs(NUM - temp[i]);
    diff[difference] = temp[i]; // [ 20519 : "964223" ]
}

// we now get a 10-values "temp" array ordered by difference
// list the [m] first IDs:

for(key in diff){
    if(n < m){
        let add = 6-diff[key].toString().length; 
        let zer = '0'.repeat(add);
        let id = zer+diff[key]; // "5802" -> "005802"
        result += (n+1)+":"+ id +" ";
        n+=1;
    }
}

alert(result);

-> "1:0078965 2:087965 3:258369 4:357984 5:399710" for "176789"

最佳答案

您实际上不需要有这么多不同的迭代。您所需要的只是循环两次:

  1. 第一次迭代尝试是使用 .map() 创建一个对象数组,用于存储 ID 以及 ID 与 num 之间的绝对差
  2. 第二次迭代尝试只是对步骤 1 中创建的对象数组使用 .sort(),将它们从最低差异到最高差异进行排名

第二次迭代完成后,您只需使用 .slice(0, 5) 即可获取数组中的前 5 个对象,该数组现在包含最小的 5 个差异。如果您只想提取 ID,请再次遍历它:

const arr = ["087965","258369","885974","078965","457896","998120","698745","399710","357984","698745","789456"];
let num = "176789";
let m = 5; // number of final machines to find

// Create an array of objects storing the original arr + diff from `num`
const diff = arr.map(item => {
  return { id: item, diff: Math.abs(+item - +num) };
});

// Sort by difference from `num` (lowest to highest)
diff.sort((a, b) => a.diff - b.diff);

// Get the first m entries
const filteredArr = diff.slice(0, m).map(item => item.id).sort();

// Log
console.log(filteredArr);

// Completely optional, if you want to format it the way you have in your question
console.log(`"${filteredArr.map((v, i) => i + ": " + v).join(', ')}" for "${num}"`);

关于javascript - 一种在 JavaScript 数组中查找最接近值的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54554662/

相关文章:

javascript - 为什么 Grunt Uglify 保留我的函数名称?

javascript - 改变 lytebox/lyteframe 的宽度和高度属性

javascript - Dijit 树文本本身不可选择/不可突出显示?

javascript - 通过单击弹出窗口外部来关闭弹出窗口

SQL 查询,它搜索具有数组列的特定项的所有行

php - 根据条件向多维数组添加键和变量

Java .contains 方法

jquery - 如何使用 javascript 更改页面方向?

C++ 入门问题

c - 如何计算C中两个矩阵之间的距离