[英]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.