如何用Lodash高效比较同集合内属性互换的对象数组?
用Lodash高效验证对象配对需求
当然有简洁高效的实现方式啦!我给你两种不同思路的方案,适配不同场景的需求:
方法一:映射表快速查找(O(n)时间复杂度)
这种方法适合处理较大的数组,效率比暴力两两遍历高很多,核心是用_.keyBy构建快速查找的映射表:
const _ = require('lodash'); const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 },{ 'x': 3, 'y': 1 },{ 'x': 4, 'y': 1 }]; // 把数组转换成以对象x值为键的映射表,方便O(1)时间查找 const xMap = _.keyBy(objects, 'x'); // 遍历数组,检查每个对象的反向配对是否存在 const hasMatchingPair = _.some(objects, (item) => { // 我们要找的是x等于当前item.y、y等于当前item.x的对象 const target = xMap[item.y]; return target && target.y === item.x; }); console.log(hasMatchingPair); // 输出: true
优势说明
_.keyBy仅需遍历一次数组构建映射,后续查找都是常数时间_.some会在找到第一个符合条件的配对后立即终止遍历,避免多余计算
方法二:直观遍历查找(O(n²)时间复杂度)
如果你的数组体量不大,这种更直观的写法也很实用,用_.find配合遍历完成检查:
const _ = require('lodash'); const objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 },{ 'x': 3, 'y': 1 },{ 'x': 4, 'y': 1 }]; const hasMatchingPair = _.some(objects, (item1, idx) => { // 从当前元素的下一位开始查找,避免重复检查同一对 return _.find(objects.slice(idx + 1), (item2) => { return item1.x === item2.y && item1.y === item2.x; }) !== undefined; }); console.log(hasMatchingPair); // 输出: true
注意点
- 用
objects.slice(idx + 1)跳过已检查过的元素,避免重复判断(比如item1和item2、item2和item1会被视为同一组) _.find找到目标后立刻返回,不会做无效遍历
如果需要获取具体的配对对象,只需要把_.some换成_.find,或者在找到时记录对应的元素即可。
内容的提问来源于stack exchange,提问作者fekky Dev
相关产品推荐
相关产品推荐

