Lodash _.cloneDeep() 正在改变一个对象 属性 在迭代期间从哈希表查找派生的对象(扑克 - 扑克牌)
Lodash _.cloneDeep() is mutating an object property derived from a hashTable lookup during an iteration (Poker - Playing Cards)
我正在 运行 遇到一个真正令人费解的错误,过去几个小时我一直试图解决这个错误,但没有成功。
我正在研究 Poker 实现。最初,我使用迭代循环生成卡片。
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
由于某种原因卡片发生了变化!我不会改变两者之间的任何东西 - 该值应该是静态的并且来自当前卡的 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的值完全改变了!为什么?我不知道 - 查找的原始上下文 table 是否已更改?如果有人对我如何解决此问题有任何提示,我将不胜感激。
附加说明 - 创建浅拷贝
let mutableHand = [...hand];
最初并没有在控制台日志中表现出这种行为——如果我什么都不做。但是,在我 运行 通过函数浅复制数组之后,即使是原始的下降甲板状态也有许多它的值突变。同样,我不确定为什么:\
完整代码可以在 codesandbox.io/s/oqx8ooyv29 上查看 - 问题源于 src/utils/card.js
中的 buildBestHand()
函数
问题代码如下:
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))
我试图找到匹配 "Pair" 的卡片的索引(玩家有 2 张带有该面的卡片),推送到最佳卡片数组,在迭代之间过滤掉该索引,然后填充其余的最佳卡片阵列及其接下来的 3 张最高卡片。
编辑:如果我这样做 hand = cloneDeep(player.showDownHand.hand).sort((a,b) => b.value - a.value);
,问题会严重恶化,几乎所有的值在最终比较中都已损坏
查看您的示例代码,您正在改变 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 这样的东西,它应该会警告你不要发生这种特殊类型的事故。
我正在 运行 遇到一个真正令人费解的错误,过去几个小时我一直试图解决这个错误,但没有成功。 我正在研究 Poker 实现。最初,我使用迭代循环生成卡片。
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
由于某种原因卡片发生了变化!我不会改变两者之间的任何东西 - 该值应该是静态的并且来自当前卡的 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的值完全改变了!为什么?我不知道 - 查找的原始上下文 table 是否已更改?如果有人对我如何解决此问题有任何提示,我将不胜感激。
附加说明 - 创建浅拷贝
let mutableHand = [...hand];
最初并没有在控制台日志中表现出这种行为——如果我什么都不做。但是,在我 运行 通过函数浅复制数组之后,即使是原始的下降甲板状态也有许多它的值突变。同样,我不确定为什么:\
完整代码可以在 codesandbox.io/s/oqx8ooyv29 上查看 - 问题源于 src/utils/card.js
buildBestHand()
函数
问题代码如下:
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))
我试图找到匹配 "Pair" 的卡片的索引(玩家有 2 张带有该面的卡片),推送到最佳卡片数组,在迭代之间过滤掉该索引,然后填充其余的最佳卡片阵列及其接下来的 3 张最高卡片。
编辑:如果我这样做 hand = cloneDeep(player.showDownHand.hand).sort((a,b) => b.value - a.value);
,问题会严重恶化,几乎所有的值在最终比较中都已损坏
查看您的示例代码,您正在改变 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 这样的东西,它应该会警告你不要发生这种特殊类型的事故。