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

如何比较类实例与实例数组元素?解决Card实例数组indexOf失效问题

解决Card实例数组中匹配属性值获取索引的问题

嘿,你说的完全没错!indexOf()方法确实是通过**严格相等(===)**来判断元素的,对于对象类型来说,它比较的是内存中的引用地址——哪怕两个Card实例的suit和rank完全一致,只要是通过new Card()创建的不同实例,它们的引用地址就不一样,所以indexOf()找不到你要的结果。

下面给你两种实用的解决方案:

方案1:直接使用findIndex()自定义比较逻辑

findIndex()是数组方法里专门用来根据自定义条件查找元素索引的,正好适配你的场景:

// 你的Card实例数组
const cards = [
  new Card('Diamonds', 'Jack'),
  new Card('Spades', '3'),
  new Card('Spades', 'Jack'),
  new Card('Diamonds', 'Ace'),
  new Card('Clubs', 'King'),
  new Card('Diamonds', '6'),
  new Card('Spades', '2'),
  new Card('Clubs', '10'),
  new Card('Spades', '7'),
  new Card('Clubs', 'Queen'),
  new Card('Spades', '10')
];

// 你要匹配的Card实例
const match = new Card('Clubs', '10');

// 查找索引
const targetIndex = cards.findIndex(card => {
  return card.suit === match.suit && card.rank === match.rank;
});

console.log(targetIndex); // 输出:7

这个方法会遍历数组,对每个元素执行回调函数,返回第一个满足属性匹配条件的元素索引;如果找不到匹配项,会返回-1,方便你做后续的异常处理。

方案2:给Card类添加自定义相等方法(更优雅的扩展性方案)

如果你的Card类后续可能添加更多属性,或者需要在多个地方做实例比较,给类添加一个equals()方法会让代码更易维护:

class Card {
  constructor(suit, rank) {
    this.suit = suit;
    this.rank = rank;
  }

  // 自定义相等比较方法
  equals(otherCard) {
    // 先判断传入的是否是Card实例,避免类型错误
    if (!(otherCard instanceof Card)) return false;
    // 比较所有需要匹配的属性
    return this.suit === otherCard.suit && this.rank === otherCard.rank;
  }
}

// 之后查找索引就可以简化成:
const targetIndex = cards.findIndex(card => card.equals(match));

这样一来,以后如果Card类新增了属性(比如color),只需要修改equals()方法里的比较逻辑,不用在所有用到比较的地方逐一修改,代码的扩展性会好很多。

补充说明

如果你只是想判断数组中是否存在匹配的实例(不需要索引),可以用cards.some(card => card.equals(match)),它会返回布尔值告诉你是否存在匹配项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:12:44