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

如何检测目标键值对同时作为嵌套数组的[0]和[1]元素存在?

判断点是否同时作为数组首尾元素存在的最优实现

嘿,我来帮你搞定这个问题!你的需求很明确:要判断currentPair这个点对象,是否既出现在allPairs中某一个子数组的第二个位置(索引[1]),又出现在另一个子数组的**第一个位置(索引[0])**对吧?

先把你给出的原始数据贴出来方便参考:

var allPairs = [
  [ { x: 1, y: 0 }, { x: 1, y: 1 }, ],
  [ { x: 1, y: 1 }, { x: 1, y: 2 }, ],
  [ { x: 1, y: 2 }, { x: 2, y: 2 }, ],
]
var currentPair = {x: 1, y: 1};

先聊聊你现有代码的注意点

你之前用两次some加计数的思路是可行的,但要注意对象是引用类型的核心问题:直接用===比较的是对象的内存地址,如果currentPair和数组里的对象是值相同但不同引用的实例,===会判断不相等,这时候得先写个辅助函数来对比值。

最优实现方案

方案1:两次some(简洁易读,适合大多数场景)

先写一个辅助函数判断两个点的值是否相等(如果你的场景中currentPair是直接从数组里取出的引用,可以跳过辅助函数,直接用===):

// 辅助函数:判断两个点对象的值是否完全一致
const isSamePoint = (pointA, pointB) => pointA.x === pointB.x && pointA.y === pointB.y;

// 核心判断逻辑:同时满足两个条件
const isBothExists = allPairs.some(pair => isSamePoint(pair[1], currentPair)) 
                    && allPairs.some(pair => isSamePoint(pair[0], currentPair));

// 对应你之前的业务逻辑:如果同时存在就返回false
if (isBothExists) {
  return false;
}

这个方案的优势是简洁易懂,而且some方法在找到第一个匹配项后会立即停止遍历,不会浪费性能。

方案2:单次遍历提前终止(性能最优,适合大数据量)

如果你的allPairs数组很大,想要只遍历一次就完成判断,可以用reduce来实现,并且在两个条件都满足时提前终止遍历:

const isSamePoint = (pointA, pointB) => pointA.x === pointB.x && pointA.y === pointB.y;

const result = allPairs.reduce((acc, pair) => {
  // 还没找到作为尾元素的情况,就检查当前子数组的第二个元素
  if (!acc.isEnd) acc.isEnd = isSamePoint(pair[1], currentPair);
  // 还没找到作为首元素的情况,就检查当前子数组的第一个元素
  if (!acc.isStart) acc.isStart = isSamePoint(pair[0], currentPair);
  
  // 一旦两个条件都满足,标记为完成,后续遍历直接返回结果
  if (acc.isEnd && acc.isStart) acc.done = true;
  return acc.done ? acc : acc;
}, { isEnd: false, isStart: false, done: false });

const isBothExists = result.isEnd && result.isStart;

if (isBothExists) {
  return false;
}

这个方案只需要遍历数组一次,并且一旦满足条件就停止后续遍历,性能是最优的。

内容的提问来源于stack exchange,提问作者icartus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:12:47