Lodash _.cloneDeep () изменяет свойство объекта, полученное в результате поиска в hashTable во время итерации (покер - игральные карты) - PullRequest
0 голосов
/ 15 октября 2018

Я сталкиваюсь с по-настоящему озадачивающей ошибкой, которую я безуспешно пытался устранить в течение последних нескольких часов.Я работаю над реализацией покера.Первоначально я генерирую карты с итеративным циклом.

const suits = ['Heart', 'Spade', 'Club', 'Diamond'];
const cards = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
const VALUE_MAP = {
    2:1,
    3:2,
    4:3,
    5:4,
    6:5,
    7:6,
    8:7,
    9:8,
    10:9,
    J:10,
    Q:11,
    K:12,
    A:13,
};
const generateDeckOfCards = () => {
    const deck = [];

    for (let suit of suits) {
        for (let card of cards) {
            deck.push({
                cardFace: card,
                suit: suit,
                value: VALUE_MAP[card]
            })
        }
    }
        return deck
}

const fullDeck = generateDeckOfCards()

Когда раунд завершен, 2 личные карты игрока и 5 общих карт объединяются в массив и сортируются по значению (по убыванию):

player.showDownHand.hand = player.cards.concat(state.communityCards);
hand = player.showDownHand.hand.sort((a,b) => b.value - a.value);

console.log(hand)
// Output:
0: Object { cardFace: "J", suit: "Heart", value: 10, … }
1: Object { cardFace: "9", suit: "Heart", value: 8, … }
2: Object { cardFace: "9", suit: "Club", value: 8, … }
3: Object { cardFace: "6", suit: "Heart", value: 5, … }
4: Object { cardFace: "5", suit: "Diamond", value: 4, … }
5: Object { cardFace: "4", suit: "Diamond", value: 3, … }
6: Object { cardFace: "3", suit: "Club", value: 2, … }
length: 7

Теперь, ошибка возникает, когда я начинаю свой метод, чтобы собрать наилучшую возможную комбинацию из 5 карт в зависимости от ранга руки.Мне нужно возиться с этим массивом и, возможно, изменять его, отфильтровывать карты, которые я выбрал, и т. Д. - поэтому я создаю глубокий клон объекта.

Существует огромная проблема - по какой-то причине values для карт CHANGE!Я не изменяю ничего между - значение должно быть статическим и получено из свойства cardFace текущей карты.

import { cloneDeep } from 'lodash';

let mutableHand = cloneDeep(hand);
console.log(mutableHand)
// Output
0: Object { cardFace: "J", suit: "Heart", value: 13, … }
1: Object { cardFace: "9", suit: "Heart", value: 8, … }
2: Object { cardFace: "9", suit: "Club", value: 8, … }
3: Object { cardFace: "6", suit: "Heart", value: 6, … }
4: Object { cardFace: "5", suit: "Diamond", value: 4, … }
5: Object { cardFace: "4", suit: "Diamond", value: 3, … }
6: Object { cardFace: "3", suit: "Club", value: 2, … }

Значения карт 0 и 3 полностью изменены!Зачем?Понятия не имею - Изменился ли исходный контекст таблицы поиска?Если у кого-то есть какие-либо подсказки, как я могу это исправить, я был бы очень признателен.

Дополнительное примечание - при создании мелкой копии с let mutableHand = [...hand]; изначально НЕ проявляется такое поведение в журнале консоли - если я ничего не делаю с этим ... Однако после запуска массивного скопированного массива через функцию, дажеисходное состояние нисходящей колоды имеет много значений, видоизмененных.Опять же, я не уверен, почему: \

Полный код можно просмотреть на codesandbox.io / s / oqx8ooyv29 - Проблема связана с функцией buildBestHand() в src/utils/card.js

Вот код проблемы:

const bestHand = [];
let mutableHand = cloneDeep(hand);
    for (let i = 0; i < 2; i++) {
        const indexOfPair = mutableHand.findIndex(card => card.cardFace === frequencyHistogramMetaData.pairs[0].face);
            bestHand.push(mutableHand[indexOfPair])
                mutableHand = mutableHand.filter((card, index) => index !== indexOfPair)
    }
        return bestHand.concat(mutableHand.slice(0, 3))

Я пытаюсь найти индекс карты, которая соответствует «Пара» (у игрока есть 2 карты с этим лицом), Нажмите на массив лучшихкарты, отфильтруйте этот индекс между итерациями, и заполните оставшуюся часть списка лучших карт их следующими 3 старшими картами.

Редактировать: Если я сделаю hand = cloneDeep(player.showDownHand.hand).sort((a,b) => b.value - a.value);, проблема сильно обострится, и почти все значения будут повреждены для окончательного сравнения

1 Ответ

0 голосов
/ 15 октября 2018

Просматривая ваш пример кода, вы изменяете значение в cards.js: 787 (что выглядит случайным).

 } else if ((cur.card.value = highValue)) {
    acc.push(cur.name);
    console.log(
      "Adding player at comparatorindex ",
      index,
      "To Winners Array"
    );
    console.log(acc);
    return acc;
  }

Я бы порекомендовал использовать что-то вроде eslint, которое должно предостеречь вас от этого конкретноговид аварии.

...