使用Lodash获取对象数组中id属性的最近后续值
解法:根据给定整数查找id最近的后续对象
这问题其实挺常见的,我给你整理几种实用的解法,你可以根据自己的场景来选择:
前提:确保数组按id升序排列
不管用哪种方法,首先得保证数组是按id从小到大排序的(如果你的原始数组已经是有序的,这一步可以省略)。排序的代码很简单:
const sortedArray = [...array].sort((a, b) => a.id - b.id);
这里用扩展运算符[...array]是为了不修改原始数组,如果你不需要保留原数组,直接排序原数组也可以。
方法1:遍历查找(简单直观,适合小数组)
这是最容易理解的方式,遍历排序后的数组,找到第一个id大于给定整数x的对象就行——因为数组是升序的,第一个满足条件的就是你要找的「最近的后续对象」。
function findNextObject(array, x) { const sortedArray = [...array].sort((a, b) => a.id - b.id); for (const obj of sortedArray) { if (obj.id > x) { return obj; } } // 如果x比所有id都大,这里可以返回null或者最后一个对象,按需调整 return null; }
比如你的示例:
- 当
x=12(10<x<=15),遍历到{id:4}(不满足)→{id:10}(不满足)→{id:15}(满足),直接返回这个对象,完全符合你的需求。
方法2:用Array.find()简化代码
本质和遍历法逻辑一样,只是用数组的find方法让代码更简洁:
function findNextObject(array, x) { const sortedArray = [...array].sort((a, b) => a.id - b.id); // find会返回第一个满足条件的元素,找不到则返回undefined,这里用|| null处理 return sortedArray.find(obj => obj.id > x) || null; }
这个写法更简洁,适合追求代码简洁性的场景。
方法3:二分查找(高效,适合大数据量)
如果你的数组元素很多(比如上千个),遍历的效率就会有点低,这时候可以用二分查找,时间复杂度是O(logn),比遍历的O(n)快很多:
function findNextObject(array, x) { const sortedArray = [...array].sort((a, b) => a.id - b.id); let left = 0; let right = sortedArray.length - 1; let result = null; while (left <= right) { const mid = Math.floor((left + right) / 2); if (sortedArray[mid].id > x) { // 当前元素符合条件,记录下来,继续往左找有没有更小的符合条件的id result = sortedArray[mid]; right = mid - 1; } else { // 当前元素id <=x,往右找更大的id left = mid + 1; } } return result; }
这个方法通过不断缩小查找范围,快速定位到目标对象,大数据量下优势明显。
额外注意点
- 如果你的原始数组已经是按id升序排列的,记得去掉排序步骤,能提升不少性能;
- 如果
x比数组中所有id都大,你可以根据业务需求调整返回值:比如返回最后一个对象,或者返回null; - 你提到每个对象的id互不关联(也就是id唯一),所以不用考虑多个相同id的情况,以上方法都能正常工作。
内容的提问来源于stack exchange,提问作者user3808307
相关产品推荐
相关产品推荐

