繁体   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