es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando utilizar la memoización del objeto para verificar si un argumento ya ha sido calculado… parece que no puedo manejar el uso de objetos como argumentos.

Así que estoy usando una función interna para el cierre y poder pasar una cantidad desconocida de argumentos. La función debe usar algún tipo de memoización (elegí usar un objeto) para verificar y ver si el resultado de ejecutar los argumentos a través de una devolución de llamada ya ha sido calculado y almacenado. Aquí está la función que he escrito hasta ahora…

function memoize(func) {
    // Definir un objeto para almacenar resultados
    let obj = {}
    // Definir una función interna para el cierre que tome un argumento
    function inner(...arg) {
        if (obj[arg]) {
            return obj[arg]
        } else {
            obj[arg] = func(...arg);
            return obj[arg];
        }
    }
    return inner;
}

Estoy obteniendo un error que dice que mi función “debe funcionar con objetos como argumentos”… Actualmente, no estoy seguro de por qué mi código actual NO funcionará con objetos como argumentos… Entonces, si alguien pudiera explicarlo, se lo agradecería mucho. Aquí está el algoritmo utilizado para probar mi función…

it('debe funcionar con objetos como argumentos', () => {
    const primeraVez = timeCheck({ foo: 'bar' });
    wait(5);
    const segundaVez = fastTimeCheck({ foo: 'bar' });
    wait(5);
    expect(primeraVez).to.not.equal(segundaVez);
    expect(fastTimeCheck({ foo: 'bar' })).to.equal(segundaVez);
    expect(fastTimeCheck({ foo: 'bar' })).to.not.equal(fastTimeCheck({ different: 'result' }));
});

Si tienes tiempo, agradecería saber por qué mi función actual no funciona con objetos como argumentos… Además, ¿cómo puedo modificar lo que he escrito para satisfacer el algoritmo de prueba?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual tu función actual puede no funcionar con objetos como argumentos es porque los literales de objetos no son claves válidas en JavaScript. Cuando intentas usar un literal de objeto como clave, será convertido a una cadena utilizando el método toString(), lo cual puede no darte el resultado deseado.

    Para modificar tu función y hacer que funcione con objetos como argumentos, puedes usar el método JSON.stringify() para convertir el objeto a una cadena y utilizarla como clave en tu objeto de memorización. Así es cómo puedes modificar tu función inner para manejar argumentos de objetos:

    function inner(...args) {
        const key = JSON.stringify(args);
        if (obj[key]) {
            return obj[key];
        } else {
            obj[key] = func(...args);
            return obj[key];
        }
    }
    

    Con esta modificación, tu función ahora debería funcionar con objetos como argumentos.

Comments are closed.