我有一张卡片清单,其中包含“套”中的宠物小精灵卡片。数据以JSON格式检索(格式/查询不在我的控制范围内)。
let myList = `
[{'hand': '1', 'cards': {'charmander','pikachu','squirtle'}},
{'hand': '2', 'cards': {'charmander','gyarados','jigglypuff'}},
{'hand': '3', 'cards': {'balbasaur','blastoise','mankey'}}]
`;
我不确定我可以用来在该列表中找到唯一手牌,即手牌3将是唯一的,因为它不包含其他手牌上的任何其他牌。
我创建了一个地图,并用每只手将其变成一个字符串用作键,然后检查该键是否已经存在。但是根据上面的数据,我不确定如何确保手牌3是真正独特的手牌,因为其他手牌中没有其他手牌。
cards = JSON.parse(myList);
let cardMap = new Map();
cards.map((hands) => {
let handAsStr = hands.cards.toString();
let matchingValue = cardMap.has(handAsStr);
if (matchingValue) {
console.log("Entry exists - Not adding " + handAsStr );
}
else {
console.log("Adding: " + handAsStr )
cardMap.set(handAsStr , {hand: hands.hand});
}
});
我考虑过将名称转换为十六进制值,然后搜索以查看该十六进制值是否存在于其他位置,但这似乎令人生畏且效率低下。
有指针吗?
最佳答案
假定为cards
的数组,您可以对所有集合的所有卡计数,并通过检查卡来过滤数组(如果所有卡的计数均为1)。
function findUnique(array) {
var count = new Map;
array.forEach(({ cards }) => cards.forEach(c => count.set(c, (count.get(c) || 0) + 1)));
return array.filter(({ cards }) => cards.every(c => count.get(c) === 1));
}
var array = [{ hand: '1', cards: ['charmander', 'pikachu', 'squirtle'] }, { hand: '2', cards: ['charmander', 'gyarados', 'jigglypuff'] }, { hand: '3', cards: ['balbasaur', 'blastoise', 'mankey'] }];
console.log(findUnique(array));