2

Tengo una funcion llamada barajar items que me recibe dos parametros, el primero es la data que quiero que me "baraje" y por otro lado name que hace que me entre en algun caso del switch; ahora el problema que tengo es que dentro del for de la funcion estoy estructurando un objeto, y dentro de ese objeto tengo unas funciones flechas que hacen algo especifico para retornarme la data, el problema radica en que cuando imprimo el objeto, las funciones que deberia retornarme un dato, me retorna toda la funcion, necesito obtener el dato y no toda la funcion. Adjunto captura de como se me imprime la data y el codigo

export const barajarItems = (params, name) => dispatch => {
    var shuffle = Array()
    switch (name) {
        case 'Kanjis' || 'Hiragana' || 'Katakana':
            console.log("case")
            for (var i = 0; i < params.length - 1; i++) {
                var tempNum0 = Math.floor(Math.random() * (params.length - 1))
                var tempNum1 = Math.floor(Math.random() * (params.length - 1))
                var tempNum2 = Math.floor(Math.random() * (params.length - 1))
                var tempArray = {
                    word: params[i].Value,
                    meaning: () => {
                        let index = Math.floor(Math.random() * params.Meanings.length - 1)
                        return (
                            index
                        );
                    },
                    words: [
                        {
                            value: params[tempNum0].Value,
                            meaning: () => {
                                var index = Math.floor(Math.random() * params.Meanings.length - 1)
                                return params[tempNum0].Meanings[index]
                            }
                        },
                        {
                            value: params[tempNum1].Value,
                            meaning: () => {
                                var index = Math.floor(Math.random() * params.Meanings.length - 1)
                                return params[tempNum1].Meanings[index]
                            }
                        },
                        {
                            value: params[tempNum2].Value,
                            meaning: () => {
                                var index = Math.floor(Math.random() * params.Meanings.length - 1)
                                return params[tempNum2].Meanings[index]
                            }
                        }
                    ]
                }
                console.log(tempArray)
            }
        default:
            break;
    }
    console.log(shuffle)
    dispatch({
        type: BARAJAR_ITEMS,
        payload: shuffle
    })
}

y esta es la captura de lo que me imprime introducir la descripción de la imagen aquí

JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
  • Hola, la pregunta es interesante, podrias agregar algunos ejemplos de valores para params y name? – erika_chan Oct 15 '19 at 02:03
  • Mira el parametro name actualmente esta recibiendo un string, yo actualmente lo tengo predefinido, el valor que le doy actualmente es el siguiente :"Kanjis", esto mas adelante sera algo manejado de manera dinamica, por otro lado params es un array con objetos y la estructura... "Words": [ { "Id": 1, "Value": "空中", "Kanjis": [ "空", "中" ] – Julian Felipe Oct 15 '19 at 02:34
  • El arreglo es mas largo pero solo doy esos valores por que creo son los mas relevantes – Julian Felipe Oct 15 '19 at 02:41
  • como puedes acceder a tu JSON si estas viendo un Objeto, como diria PabloLozano [JSON != Objeto](https://es.stackoverflow.com/questions/164943/cu%c3%a1l-es-la-diferencia-entre-json-y-un-objeto-en-javascript) – JackNavaRow Oct 15 '19 at 13:20
  • que tal si intentas algo como `meaning: () => { let index = Math.floor(Math.random() * params.Meanings.length - 1) return ( index ); }()` – JackNavaRow Oct 15 '19 at 13:23
  • te invito a leer [esta pregunta](https://es.stackoverflow.com/questions/173839/qué-sentido-tiene-un-al-final-de-la-definición-de-una-función-en-javascrip) – JackNavaRow Oct 15 '19 at 13:36

2 Answers2

3

Si entiendo correctamente, lo que podrías es usar IIFE: Expresión de función ejecutada inmediatamente, esto quiere decir que ejecutamos la función al momento de definirla, usando la sintaxis (//funcion)() para que en lugar de guardar la definición de la función se almacene el resultado de esa función:

const obj = {
    meaning: (()=>{return "mi función";})()
}

console.log(obj.meaning);//<-- esta guardado el return, no la definición.

En tu código:

meaning: (() => {
    var index = Math.floor(Math.random() * params.Meanings.length - 1)
    return params[tempNum1].Meanings[index]
})();
Emeeus
  • 7,104
  • 8
  • 25
1

El hecho de que tienes N funciones iguales debería darte una pista de que estás haciendo algo mal: No estás respetando la filosofía DRY (Don't repeat yourself, No te repitas).

Lo que puedes hacer:

Primero definir la función que te da un valor al azar de un array:

function getRandomValue(array) {
  const randomIndex = Math.floor(Math.random() * array.length - 1);
  return array[randomIndex];
}

Y ahora llamarla las veces que lo necesites, te quedaría algo como:

function getRandomValue(array) {
  const randomIndex = Math.floor(Math.random() * array.length - 1);
  return array[randomIndex];
}

var tempArray = {
  word: params[i].Value,
  meaning: Math.floor(Math.random() * params.Meanings.length - 1),
  words: [] //lo declaramos vacío
}

//lo rellenamos con este bucle
for (let i = 0; i < 3; i++){
  tempArray.words.push({
    value: getRandomValue(params).Value,
    meaning: getRandomValue(getRandomValue(params).Meanings);
  });
}  
Pablo Lozano
  • 45,934
  • 7
  • 48
  • 87