Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Lista de Exercícios aula 4 (1-3) contém também uma funçao que ajuda a depurar o reduce

const produtos = require('./dados.json');

function imprimeProdutos(obj) {
    for(const produto in obj) {
        for(const detalhes of obj[produto]) {
            console.log(`O id do produto é: ${detalhes.id} corresponde a ${detalhes.nome} com o preço de: ${detalhes.preço}`);
        }
    }
}
// Retorna um array que contém todos os dados sem saber de qual proprieda pertencem
function filtrarProdutosPorPrecoEmArray(obj, propriedade, condicao) {
    // Array vazio para receber o resultado do filtro
    let filtro = [];
    for (const produto in obj) { 
       //filter usa a função callback sendo item o objeto e a propriedade em [] o campo do objeto como bebidas.preco, verifica se a propriedade é valida
       filtro.push(...obj[produto].filter((item) => {
            if(!item.hasOwnProperty(propriedade)) {
                throwPropertyNotFoundError(propriedade,item);
            } else {
                return condicao(item[propriedade]); // Cria um array com todos os elementos sem distinção de sub-categoria
            }
       }))
    }
    //retorna o array
    return filtro;
}
// Mantém a estrutura original do objeto
function filtrarProdutosPorPrecoMantendoEstrutura(obj, propriedade, condicao) {
    // Manter a estrutura original e retornar um novo objeto que não altera o original
    const resultado = {};
    // For in para iterar todos os objetos do array
    for (const produto in obj) {
        // resutaldo.chave = obj.chave e filtra todos os resultados dentro da chave onde a condição é true
        resultado[produto] = obj[produto].filter((item) => {
            if(!item.hasOwnProperty(propriedade)) {
                throwPropertyNotFoundError(propriedade,item);
            } else {
                return condicao(item[propriedade]);
            }
        })
    }
    //retorna o objeto
    return resultado;
}
// Assim como o método acima retorna a exata estrutura do objeto
function filtrarProdutosPorPrecoComReduce(obj, propriedade, condicao) {
    // Object.keys() retorna todas as chaves do objeto (por exemplo, 'bebidas', 'pereciveis') e as converte em um array de strings.
    // O método reduce() é usado para iterar sobre esse array de chaves, acumulando os resultados em um objeto (acc).
    // A cada iteração, a chave atual (por exemplo, 'bebidas') é usada para acessar os itens dentro dessa categoria (array).
    // O método filter() é aplicado aos itens dessa categoria, verificando se o preço (ou qualquer outra propriedade) atende à condição fornecida.
    // O item que atende à condição é adicionado ao acumulador (acc), mantendo a estrutura original do objeto.
    return Object.keys(obj).reduce((acc, produto) => {
        acc[produto] = obj[produto].filter((item) => {
            // Verfica se a propriedade existe no objeto e envia um erro.
            if(!item.hasOwnProperty(propriedade)) {
                throwPropertyNotFoundError(propriedade,item);
            }
            else {
                // retorna o objeto e suas propriedades baseados na condição
                return condicao(item[propriedade]);
            } 
        });
        // retorna o acumulador completamente filtrado
        return acc;
    }, {}); // valor inicial do acumulador e um objeto vazio
}

function throwPropertyNotFoundError(propriedade,item) {
    throw new Error(`Propriedade '${propriedade}' não encontrada no objeto: ${JSON.stringify(item)}`);
}

imprimeProdutos(produtos);
// Bloco para lidar com a exceção qualquer uma das funções podem ser utilizadas todas foram testadas.
try {
    const produtoFiltradoPreco = filtrarProdutosPorPrecoComReduce(produtos, 'preco', preco => preco > 4);
    console.log(produtoFiltradoPreco);
    const produtoFiltradoId    = filtrarProdutosPorPrecoComReduce(produtos, 'id', id => id > 2);
    console.log(produtoFiltradoId);
} catch (error) {
    console.log('Ocorreu um erro:', error.message)
}

// const tableTest =  tableTestReduce(produtos, 'preco', preco => preco > 4);

function tableTestReduce (obj, propriedade, condicao) {
    return Object.keys(obj).reduce((acc, produto) => {
        console.log(`Processando categoria: ${produto}`); // Qual a chave atual que vai ser iterada
        const resultadoFiltrado = obj[produto].filter((item) => { 
          console.log(`Item iterado: ${JSON.stringify(item)} verificando a propriedade ${propriedade} com a condição ${condicao}`) // Log do item e da condição aplicada
          return condicao(item[propriedade]); // retorna true/false e adiciona quando a condição é verdadeira
        });    
        acc[produto] = resultadoFiltrado; // Adiciona ao acumulador a lista filtrada
        console.log(`Itens filtrados: ${JSON.stringify(resultadoFiltrado)}`); // Log dos itens filtrados
        console.log(`Acumulador atualizado:`, acc); // Log do estado do acumulador
        return acc; // Retorna o acumulador atualizado
    }, {});
}
1 resposta
solução!

Bom dia, Israel!

Seu código está ótimo - apresenta boa estrutura e endentação correta. Parabéns! Isso é super importante para que a leitura seja de fácil entendimento. Continue praticando e aplicando seus conhecimentos.

Abraços!