Estoy creando una baraja de cartas (una matriz de objetos de cartas) combinando una matriz de objetos de palo y una matriz de objetos de cartas, usando javascript.

Estoy usando un bucle forEach para recorrer los palos, y anidado es un bucle de mapa para las tarjetas.

Console.log está devolviendo el objeto correcto para empujar a la nueva matriz, sin embargo, el .push () solo agrega un objeto combinado usando el último palo y la última carta.

¿Dónde me estoy equivocando con esto?

He intentado múltiples bucles y métodos diferentes para agregar a una nueva matriz sin suerte. Console.log () devuelve el valor correcto, pero no puedo insertar los objetos combinados correctos en una nueva matriz.

  // Deck of Cards
var suits = [
  { suit: "clubs", color: "black" },
  { suit: "spades", color: "black" },
  { suit: "hearts", color: "red" },
  { suit: "diamonds", color: "red" }
];

var family = [
  { name: "2", value: 2 },
  { name: "3", value: 3 },
  { name: "4", value: 4 },
  { name: "5", value: 5 },
  { name: "6", value: 6 },
  { name: "7", value: 7 },
  { name: "8", value: 8 },
  { name: "9", value: 9 },
  { name: "10", value: 10 },
  { name: "J", value: 10 },
  { name: "Q", value: 10 },
  { name: "K", value: 10 },
  { name: "A", value: 1 },
];

var deck = new Array();

suits.forEach(function (x) {
  var arr = family.map((y) => {
    var obj = Object.assign(x, y);
    console.log(obj);
    deck.push(obj);
    return obj;
  });
  
  console.log(arr);
});

console.log(deck);
0
flowoverstack 10 may. 2019 a las 22:43

3 respuestas

La mejor respuesta

Pruebe Object.assign({}, x, y) en lugar de Object.assign(x, y). Actualmente estás manipulando el objeto que es x, al agregarle todas las propiedades de y.

// Deck of Cards
var suits = [
    {suit: "clubs",color: "black"},
    {suit: "spades",color: "black"},
    {suit: "hearts",color: "red"},
    {suit: "diamonds",color: "red"}    
];

var family = [
    {name: "2",value: 2},
    {name: "3",value: 3},
    {name: "4",value: 4},
    {name: "5",value: 5},
    {name: "6",value: 6},
    {name: "7",value: 7},
    {name: "8",value: 8},
    {name: "9",value: 9},
    {name: "10",value: 10},
    {name: "J",value: 10},
    {name: "Q",value: 10},
    {name: "K",value: 10},
    {name: "A",value: 1},
];

var deck = new Array();

suits.forEach(function(x){

    var arr = family.map( (y) => {
        var obj = Object.assign({}, x, y); 
        deck.push(obj);
        return obj; 
    });

});

console.log(deck);
9
Slawomir Chodnicki 10 may. 2019 a las 19:45

Object.assign(x,y) pondrá los valores de y en x. Desea dejar solo x, así que almacene sus propiedades en un nuevo Objeto usando Object.assign({}, x,y). Considere la demostración a continuación:

var suits = [
    {suit: "clubs",color: "black"},
    {suit: "spades",color: "black"},
    {suit: "hearts",color: "red"},
    {suit: "diamonds",color: "red"}    
];

var family = [
    {name: "2",value: 2},
    {name: "3",value: 3},
    {name: "4",value: 4},
    {name: "5",value: 5},
    {name: "6",value: 6},
    {name: "7",value: 7},
    {name: "8",value: 8},
    {name: "9",value: 9},
    {name: "10",value: 10},
    {name: "J",value: 10},
    {name: "Q",value: 10},
    {name: "K",value: 10},
    {name: "A",value: 1},
];

const tmp = suits.reduce((acc, s) => {
  return acc.concat(family.map(f => {
    return Object.assign({}, f, s);
  }));
}, []);

const pre = document.createElement("pre");
pre.innerHTML = JSON.stringify(tmp, null, 4);
document.body.appendChild(pre);
1
zero298 10 may. 2019 a las 19:58

Si puede usar flatmap, entonces puede simplificarse significativamente:

const suits = [{ suit: "clubs", color: "black" }, { suit: "spades", color: "black" }, { suit: "hearts", color: "red" }, { suit: "diamonds", color: "red" }]
const family = [{ name: "2", value: 2 }, { name: "3", value: 3 }, { name: "4", value: 4 }, { name: "5", value: 5 }, { name: "6", value: 6 }, { name: "7", value: 7 }, { name: "8", value: 8 }, { name: "9", value: 9 }, { name: "10", value: 10 }, { name: "J", value: 10 }, { name: "Q", value: 10 }, { name: "K", value: 10 }, { name: "A", value: 1 }]

const deck = suits.flatMap(s => family.map(f => ({...s, ...f})))

console.log(deck)

Una nota al margen, parece haber una fuerte convención (presumiblemente de Bridge) de ordenar los palos / diamantes / corazones / espadas. En inglés es fácil de recordar ya que son alfabéticos).

1
Scott Sauyet 10 may. 2019 a las 20:04