如何用JS实现按指定数字由近及远排序对象数组?
按与目标值的距离排序数组(含对象数组)
嘿,这个需求其实挺常见的,核心就是利用Array.sort()配合自定义比较函数,通过计算元素与目标值的绝对距离来排序。我来一步步拆解给你看:
一、先从基础的数字数组入手
你给的例子里,目标值是5.6666,数组是[-1, 9, 4, 10, 11, 0]。我们需要计算每个元素和目标值的绝对差,然后按差值从小到大排序(差值越小,距离越近)。
实现代码如下:
const target = 5.6666; const numbers = [-1, 9, 4, 10, 11, 0]; numbers.sort((a, b) => { // 计算每个元素与目标值的绝对距离 const distanceA = Math.abs(a - target); const distanceB = Math.abs(b - target); // 比较距离:返回负数则a排在b前,正数则b在前,0保持原顺序 return distanceA - distanceB; }); console.log(numbers); // 输出:[4, 9, 10, 11, 0, -1] // (注:你给出的示例结果里11在0后面,其实是计算错误哦——11和5.6666的距离是5.3334,0和5.6666的距离是5.6666,所以11应该更近)
二、扩展到对象数组(按指定键值排序)
如果是对象数组,只需要在比较函数里提取对应键的值再计算距离就行。比如假设你的对象有一个value键,我们要按这个键的值和目标值的距离排序:
const target = 5.6666; const objArray = [ { id: 1, value: -1 }, { id: 2, value: 9 }, { id: 3, value: 4 }, { id: 4, value: 10 }, { id: 5, value: 11 }, { id: 6, value: 0 } ]; objArray.sort((a, b) => { // 提取指定键的值,计算绝对距离 const distanceA = Math.abs(a.value - target); const distanceB = Math.abs(b.value - target); // 可选:如果两个元素距离相同,可以添加额外排序规则(比如按value从小到大) if (distanceA === distanceB) { return a.value - b.value; } return distanceA - distanceB; }); console.log(objArray); // 输出的对象数组会按value与5.6666的距离由近及远排列
关键知识点梳理
- 用
Math.abs()计算元素与目标值的绝对距离,确保差值为正数 Array.sort()的比较函数逻辑:- 返回负数 →
a排在b前面(距离更近的在前) - 返回正数 →
b排在a前面 - 返回0 → 保持原相对顺序(若需严格稳定排序可额外处理)
- 返回负数 →
- 对象数组适配:只需提取对象的指定键值,再套用相同的距离计算逻辑就行
内容的提问来源于stack exchange,提问作者Rami Chasygov
相关产品推荐
相关产品推荐

