4
respostas

Refatorar Codigo

Olá, eu quero refatorar esse código esta muito verboso, gostaria de ideias para tornar o mesmo mais simples, fiz ele no NODE. Oque ele deve fazer, é recebe um JSON que tem uma informação ID exemplo= ( ID:1 ), e busca em um diretório de imagens, uma imagem que tenha mesmo nome que o ID retornado, se id do JSON igual nome da img, retorna os dois em um outro JSON;

exports.listaBebidas = (req, res) => {
    //busca img no diretorio
    let directoryPacth = path.join(__dirname, '../../imagens/categorias/bebidas');
    //lê diretorio
    var files = fs.readdirSync(directoryPacth);
    // function listaitem() {
    if (files != '') {
        let buscafor = JSON.stringify(valor.result[0].Retorno.Items.length);
        let comparar;
        let n = 0;
        for (let i = 0; i < buscafor; i++) {
            comparar = JSON.stringify(valor.result[0].Retorno.Items[i].ID);
            for (let j = 0; j < files.length; j++) {
                if (files[j] == comparar + ".png") {
                    content[j] = imageToUri(directoryPacth + '/' + files[j]);
                    valorFinal[j] = { valorDefnido: valor.result[0].Retorno.Items[n], imagem:content[j] };

                }
            }
            n++;
        } if (valorFinal == '') {
            valorFinal = "Nada encontrado";

        }
    }
    res.status(201).json(
        valorFinal

    )
};
4 respostas

Na sua pergunta você já meio que terminou respondendo-a, você pode dividir o código por funcionalidade.

Sendo assim, você deve dividi-lo em funções que:

  • Lista os arquivos do diretório em questão;
  • Filtra as imagens do diretório a partir do id informado;

Por que você criou esta instrução?

JSON.stringify(valor.result[0].Retorno.Items.length)

você está recuperando Items da mesma forma em vários cantos, por que não criar uma variavel para ele?

const items = valor.result[0].Retorno.Items[i];

Pode adicionar um break dentro do if para caso o arquivo seja encontrado finalizar a busca

for (let j = 0; j < files.length; j++) {
    if (files[j] == comparar + ".png") {
        content[j] = imageToUri(directoryPacth + '/' + files[j]);
        valorFinal[j] = {
            valorDefnido: valor.result[0].Retorno.Items[n],
            imagem:content[j]
        };
        break;
    }
}

O código é funcional eu só queria uma ideia de reduzir esses FOR, achei extenso demais.

JSON.stringify(valor.result[0].Retorno.Items.length)

esse código acima eu usei para saber quantos itens o JSON me Trouxe para saber quantos loops de busca eu vou percorrer no diretório de imagens. Como a suposição abaixo exemplo o Items tem dois valores, então eu sei que tenho que buscar duas imagens.

Items:{
0:[]
1:[]
}

mas vou tentar separar por função e usar a ideia do break, agradeço a orientação.

esse código acima eu usei para saber quantos itens o JSON me Trouxe para saber quantos loops de busca eu vou percorrer no diretório de imagens

Sendo assim, acredito que você pode usar somente

valor.result[0].Retorno.Items.length

esse JSON.stringify é um método utilizado para transformar objetos JSON em strings.

Com relação ao for, o Array em Javascript possui um método find em que elel aplica um filtro e retorna somente um resultado, pensei em sugeri-lo, porém vi que você está utilizando a variável J para popular outros arrays, então não sei se se aplica para o seu caso.

Vou tentar seguir sua dica; Sim! Tenho 2 FOR e 3 ARRAYS , por isso eu queria reduzir esse código, ele funciona mas com certeza tem forma melhor de fazer o mesmo. Agradeço a reposta.