Para un proyecto, debemos verificar si todos los números en una tarjeta coinciden con otra tarjeta con números sorteados. Cuando está codificado con const checkCard = card001, va bien con .every. Al intentar elegir la tarjeta de forma dinámica, extrayendo el número de un almacenamiento local (por ejemplo, const card = 'card'+cardNumber), aparece un error con t.every is not a function. La pregunta: cómo hacer esta dinámica. Esperamos que alguien pueda ayudar a superar este problema.
checkCard = () => { var cardNumber = localStorage.cardNumber; const card001 = [14, 4, 10, 8, 12, 30, 28, 23, 16, 27, 41, 35, 43, 39, 53, 57, 46, 48, 56, 74, 68, 75, 70, 66] const card002 = [15, 13, 8, 1, 12, 26, 20, 19, 28, 24, 38, 42, 33, 41, 59, 53, 60, 55, 51, 68, 62, 71, 70, 65] const card003 = [11, 5, 4, 13, 9, 23, 27, 16, 18, 26, 44, 38, 40, 36, 53, 47, 56, 55, 50, 69, 65, 63, 61, 74] const previousCallList = JSON.parse(JSON.stringify(this.previousCallList)); console.log('previousCallList: ', previousCallList) const previousCallListNumber = JSON.parse(JSON.stringify(this.previousCallListNumber)); console.log('previousCallListNumber: ', previousCallListNumber) //const card = 'card'+cardNumber; const checkCard = card001 const checkDrawn = previousCallListNumber ; const containsAll = checkCard .every(element => { return checkDrawn.includes(element); }); console.log(containsAll); // 👉️ true } }
Hay una diferencia entre estas dos líneas:
// Point `checkCard` to the current array stored in `card001` const checkCard = card001 // Point `checkCard` to a string "card001" const checkCard = "card001"
Cuando escribe 'card'+cardNumber
, está creando una nueva cadena , no una referencia a otra variable.
Si desea elegir dinámicamente una variable en función de su nombre, puede definir propiedades con nombre en un objeto. Por ejemplo:
const myObject = { a: 1, b: 2, c: 3 }; console.log( myObject["a"], myObject["b"], myObject["c"] )
O, con tus datos:
const cardNumber = "001"; const card001 = [14, 4, 10, 8, 12, 30, 28, 23, 16, 27, 41, 35, 43, 39, 53, 57, 46, 48, 56, 74, 68, 75, 70, 66] const card002 = [15, 13, 8, 1, 12, 26, 20, 19, 28, 24, 38, 42, 33, 41, 59, 53, 60, 55, 51, 68, 62, 71, 70, 65] const card003 = [11, 5, 4, 13, 9, 23, 27, 16, 18, 26, 44, 38, 40, 36, 53, 47, 56, 55, 50, 69, 65, 63, 61, 74] const cardVarName = "card" + cardNumber; log(cardVarName); // This is now the string "card001", not a reference to the card001 variable // Store the cards in an object const cards = { card001, card002, card003 }; // Reference a card using obj[propertyName] log(cards[cardVarName]) function log(x) { console.log(JSON.stringify(x)); }
Si tiene la intención de utilizar localStorage
, debe familiarizarse con la sintaxis, lo que tiene ahora...
localStorage.cardNumber;
...debería haberte dado un error. Las siguientes son dos funciones que obtienen y establecen datos hacia y desde localStorage
:
/* >key< is a string assigned as an id to stored data. If there isn't anything stored an empty array is returned/ */ const getLS = key => JSON.parse(localStorage.getItem(key)) || []; /* >key< is same as above. >data< is the value that needs to be stored. */ const setLS = (key, data) => localStorage.setItem(key, JSON.stringify(data));
Tenga en cuenta que LS
solo almacena cadenas, por lo que se JSON.parse()
y JSON.stringify()
en los datos. En el ejemplo, las líneas relacionadas con LS
están comentadas porque los fragmentos SO las prohíben; simplemente elimínelas cuando las pruebe en un entorno normal.
Los detalles se comentan en el ejemplo a continuación.
// Utility function const log = data => console.log(JSON.stringify(data)); //const getLS = key => JSON.parse(localStorage.getItem(key)) || []; //const setLS = (key, data) => localStorage.setItem(key, JSON.stringify(data)); /* All arrays as parameters so function can be reusable */ const deckA = [14, 4, 10, 8, 12, 30, 28, 23, 16, 27, 41, 35, 43, 39, 53, 57, 46, 48, 56, 74, 68, 75, 70, 66]; const deckB = [15, 13, 8, 1, 12, 26, 20, 19, 28, 24, 38, 42, 33, 41, 59, 53, 60, 55, 51, 68, 62, 71, 70, 65]; const deckC = [11, 5, 4, 13, 9, 23, 27, 16, 18, 26, 44, 38, 40, 36, 53, 47, 56, 55, 50, 69, 65, 63, 61, 74]; /** * find match between a given number and a * number from one or more given arrays * @param {number} card = Number to find * @param {arrays} cards = One or more arrays * @returns {array<object>} Each object is * created like this: * {card: 55, row: 2, col: 17} * "card 55 is in the 3rd array index 17" */ const findMatch = (card, ...cards) => { //const data = getLS('cards'); //data.push(card); //setLS('cards', data); // Gather ...cards into an array: // [ [deckA], [deckB], [deckC] ] const decks = [...cards]; /* First, .map() runs through each sub-array and .flatMap() compares each number of each sub- array vs. card. If there's a match, return a new object (see above) otherwise an empty array is returned */ return decks.map((sub, row) => sub.flatMap((num, col) => num === card ? {card: card, row: row, col: col} : [])).flat(); }; log(findMatch(55, deckA, deckB, deckC)); log(findMatch(3, deckA, deckB, deckC)); log(findMatch(25, deckA, deckB, deckC)); log(findMatch(13, deckA, deckB, deckC));