Есть ли способ сравнить экземпляр класса с элементами в массиве экземпляров этого класса?

#javascript #javascript-objects

#javascript #javascript-объекты

Вопрос:

У меня есть массив объектов, которые создаются как новые экземпляры класса Card, и другой экземпляр класса Card, для которого я хочу найти индекс в массиве и объединить:

 ...
this.cards.push(new Card(suit, rank));
>>>
        [
          Card { suit: 'Diamonds', rank: 'Jack' },
          Card { suit: 'Spades', rank: '3' },
          Card { suit: 'Spades', rank: 'Jack' },
          Card { suit: 'Diamonds', rank: 'Ace' },
          Card { suit: 'Clubs', rank: 'King' },
          Card { suit: 'Diamonds', rank: '6' },
          Card { suit: 'Spades', rank: '2' },
          Card { suit: 'Clubs', rank: '10' },
          Card { suit: 'Spades', rank: '7' },
          Card { suit: 'Clubs', rank: 'Queen' },
          Card { suit: 'Spades', rank: '10' }
        ]
    
const match = new Card('Clubs', rank: '10');
>>>     Card { suit: 'Clubs', rank: '10' }
  

Функция должна возвращать индекс 7 при поиске соответствия в заданном массиве.
Метод indexOf() не дает желаемого результата. Я подозреваю, что я сравниваю местоположения в памяти, а не значения, но не знаю, как подойти к этой проблеме.

Комментарии:

1. Используйте findIndex()-метод, который позволяет определить обратный вызов, который проверяет наличие объектов с равным значением.

Ответ №1:

Ваше предположение

Я подозреваю, что я сравниваю местоположения в памяти, а не значения

правильно. Array.prototype.findIndex твой друг здесь:

 function compareCards(a,b) {
  return Object.keys(a).every(key => a[key] === b[key]) amp;amp; Object.keys(b).every(key => b[key] === a[key]);
}

const arr = [{
    suit: 'Diamonds',
    rank: 'Jack'
  },
  {
    suit: 'Spades',
    rank: '3'
  },
  {
    suit: 'Spades',
    rank: 'Jack'
  },
  {
    suit: 'Diamonds',
    rank: 'Ace'
  },
  {
    suit: 'Clubs',
    rank: 'King'
  },
  {
    suit: 'Diamonds',
    rank: '6'
  },
  {
    suit: 'Spades',
    rank: '2'
  },
  {
    suit: 'Clubs',
    rank: '10'
  },
  {
    suit: 'Spades',
    rank: '7'
  },
  {
    suit: 'Clubs',
    rank: 'Queen'
  },
  {
    suit: 'Spades',
    rank: '10'
  }
];

const cardToFind = {
  suit: 'Clubs',
  rank: 'King'
};

let index = arr.findIndex(card => compareCards(card, cardToFind));

console.log(index);  

Ответ №2:

Вы можете просто написать пользовательскую функцию indexOf для проверки объекта.

 function myIndexOf(o) {    
    for (var i = 0; i < this.cards.length; i  ) {
        if (this.cards[i].suit == o.suit amp;amp; this.cards[i].rank == o.rank) {
            return i;
        }
    }
    return -1;
}
  

Ответ №3:

Вы можете использовать метод findIndex . Он возвращает индекс первого элемента в массиве, который проходит тест (предоставляется как функция).

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

let cards = [
  { suit: "Diamonds", rank: "Jack" },
  { suit: "Spades", rank: "3" },
  { suit: "Spades", rank: "Jack" },
  { suit: "Diamonds", rank: "Ace" },
  { suit: "Clubs", rank: "King" },
  { suit: "Diamonds", rank: "6" },
  { suit: "Spades", rank: "2" },
  { suit: "Clubs", rank: "10" },
  { suit: "Spades", rank: "7" },
  { suit: "Clubs", rank: "Queen" },
  { suit: "Spades", rank: "10" },
];

const match = (card, cards) => {
  return cards.findIndex((x) => x.suit === card.suit amp;amp; x.rank === card.rank);
};

console.log(match(new Card("Clubs", "10"), cards));