簡體   English   中英

For-loop,map和forEach Javascript

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM