我正在尝试创建一副52张牌。我可以使用双重for循环轻松创建它,但它具有O(n2)复杂度。所以我试图使用map()和forEach()数组方法,但事情很复杂,他们需要返回东西。以下是我的代码。
(function deckCreate() {
var values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
var suits = ["clubs", "diamonds", "hearts", "spades"];
var newDeck = values.map(function(xValue) {
suits.forEach(function(xSuit) {
return [xSuit,xValue];
});
});
return newDeck;
}());

它给出了一个长度为13的数组,所有内部都未定义。我尝试在map()之前交换forEach()只是因为但是结果是一样的。
我在这些函数中的console.log()时发现的问题是元素没有相互映射,而是分别打印出来。可能是什么问题?
答案 0 :(得分:1)
我认为简化它会更好。
我们知道只有4件套装,所以它足以按照套装名称获取清单:
function createDeck() {
var values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
var deck = {"clubs": values.slice(), "diamonds": values.slice(), "hearts": values.slice(), "spades": values.slice()};
return deck;
}
var deck = createDeck();
console.log('CLUBS:', deck.clubs);
console.log('DIAMONDS:', deck.diamonds);
console.log('HEARTS:', deck.hearts);
console.log('SPADES:', deck.spades);

P.S。在我的情况下,我将创建一个类,使得生成,迭代等等东西可以轻松使用它。
function Deck() {
var values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
var suits = ['clubs', 'diamonds', 'spades', 'hearts'];
this.getSuits = function() {return suits.splice();}
this.getValues = function() {return values.splice();}
var asObject;
this.asObject = function() {
if(asObject) return asObject;
asObject = {};
suits.map(function(suit) {
asObject[suit] = values.slice();
});
return asObject;
};
var asArray;
this.asArray = function() {
if(asArray) return asArray;
asArray = [];
suits.map(function(suit) {
values.map(function(value) {
asArray.push([suit, value]);
});
});
return asArray;
}
this.iterate = function(fn) {
this.asArray().map(fn);
}
}
var deck = new Deck();
deck.iterate(function(card) {
console.log('CARD: ', card[0], card[1]);
});
console.log(deck.asObject());
console.log(deck.asArray());

答案 1 :(得分:1)
使用简单的for
循环。使用suits[Math.floor(i / 13)]
获得正确的诉讼,并使用remainder operator %
获取每件诉讼的卡号:
function deckCreate() {
var values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
var suits = ["clubs", "diamonds", "hearts", "spades"];
var newDeck = [];
for (var i = 0; i < 52; i++) {
newDeck.push([suits[Math.floor(i / 13)], values[i % 13]]);
}
return newDeck;
}
var result = deckCreate();
console.log(result);
&#13;
答案 2 :(得分:0)
您没有从map
函数返回任何内容,因此隐式返回值为undefined
,因此您的数组包含13个undefined
值。
suits.forEach
需要return suits.map
。这将为您提供13个元素的数组,其中每个元素是一个包含四个元素的数组,其中 inner 数组的每个元素都是一个两元素[suit, value]
数组。然后,您可以将顶级数组reduce
放入您之后的52个元素数组中:
var newDeck = values.map(function(xValue) {
return suits.map(function(xSuit) {
return [xSuit,xValue];
});
}).reduce(function (a, b) { return a.concat(b) });
答案 3 :(得分:0)
您遇到问题的原因是您没有从外部.map()
回调中返回。但即使您这样做,[].forEach
总是返回undefined
,无论其回调内部发生了什么。
因此,由于您使用forEach
迭代内部数组,因此从map
获得了13个未定义的数组。
你应该使用的是.map()
一直向下并返回每一步:
const first = [1, 2, 3];
const second = ['a', 'b', 'c'];
const mapped = first.map(function(digit) {
return second.map(function(letter) {
return [digit, letter];
});
});
console.log(mapped);
看到你如何清楚地学习和提高自己,我会让你根据具体情况调整这个例子。
P.S。如果您需要扁平数组,请查看[].reduce()
和[].concat()
。