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
}, {});
}