我有一张卡片清单,其中包含“套”中的宠物小精灵卡片。数据以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));

09-28 12:49