我正在研究一种小型算法,用于在随机数字数组中查找给定数字的最接近值。就我而言,我正在尝试检测由 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"
最佳答案
您实际上不需要有这么多不同的迭代。您所需要的只是循环两次:
- 第一次迭代尝试是使用
.map()
创建一个对象数组,用于存储 ID 以及 ID 与num
之间的绝对差 - 第二次迭代尝试只是对步骤 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/