for循环,map和forEach Javascript

时间:2017-01-07 20:47:55

标签: javascript arrays

我正在尝试创建一副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 个答案:

答案 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;
&#13;
&#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()