[英]For-loop, map and forEach Javascript
我正在尝试创建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()中发现的问题是,这些元素没有相互映射,而是分别打印。 可能是什么问题?
我认为最好简化一下。
我们知道只有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);
在我的情况下,PS将创建一个类,该类使生成,迭代等操作易于使用。
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());
使用简单的for
循环。 使用suits[Math.floor(i / 13)]
来获得合适的西服,并使用余数运算符 %
来获取每套西服的卡号:
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);
您不会从map
函数返回任何内容,因此隐式返回值是undefined
,因此您的数组包含13个undefined
值。
suits.forEach
需要return suits.map
。 这将为您提供13个元素的数组,其中每个元素是四个元素的数组, 内部数组的每个元素是两个元素[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) });
您遇到麻烦的原因是您没有从外部.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);
看看您是如何尝试学习和改善自己的,我将让您根据具体情况调整此示例。
PS。如果你想有一个扁平的数组,看看[].reduce()
和[].concat()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.