You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:18:52