Eu tenho esse Array de Json com dois registros, eu preciso somar o valor do atributo “total” de cada um deles. Por exemplo, cada um deles possuem o atributo total, no caso o primeiro registro tem um valor total de 342 e o segundo o valor 417. O que preciso é atribuir a soma de um com o outro em uma variável para que eu possa apresentar a soma na tela.
No caso a minha variável teria o valor igual a 759 (342 + 417).
const array = [ /* your JSON goes here */ ];
let total = 0;
array.forEach(a =>
a.visualization.forEach(v =>
v.intervals.forEach(i =>
i.types.forEach(t => total += t.total))));
console.log(total);
EDIT: Alterei minha resposta um pouco depois de ver a do @PedreiroDeSoftware porque vi que era desnecessário criar o array totals e depois fazer reduce.
@PedreiroDeSoftware entendo que a estrutura do JSON que você propos é mais eficiente para analisar no cliente, mas uma vez me disseram que não é boa prática uma API retornar JSON dessa forma, que o JSON tem que ter significado semântico condizente com o tipo de objeto que está retornando. Que quando você retorna do jeito que você sugeriu ele fica atrelado a uma estrutura de tabela e não poderia ser usado em outros contextos. Voce poderia comentar sobre essas afirmações, por favor?
Com algumas adaptações as duas soluções funcionaram para esse retorno Json que mandei como exemplo …
@PedreiroDeSoftware quanto ao retorno do json da api, é somente isso que recebo, não tenho como alterar, e também a minha grid já está toda estruturada nesse formato de retorno. O meu problema esta sendo apenas a soma dos valores totais.
@PedreiroDeSoftware Depois de realizar mais testes diferentes, encontrei um gap para o foreach por meio do index de cada objeto.
O que acontece é que o retorno Json pode variar de acordo com os dados segue um exemplo.
Veja que tenho casos que o meu ‘valueVisualize’ possui mais de um total, nesse caso precisaria ter um ‘total’ de cada ‘visualization’ e depois um total geral da soma de cada visualization …
@wldomiciano, é difícil responder a essa pergunta.
Eu não tenho um argumento que tenha sido objeto de pesquisa, ou outra referência, é uma experiência/observação particular.
Então posso apenas levantar novos questionamentos.
Assim, tomemos como ponto de partida a consulta ao banco de dados.
É uma boa prática trazer mais dados que o necessário em uma consulta para que o objeto persistido seja semanticamente equivalente ao json?
É uma boa prática criar vários DTOs para atender as consultas customizadas?
Ao criar um DTO, não se perde a compatibilidade semântica entre o objeto original e o consultado?
O correto não seria a ferramenta servir ao desenvolvedor e não o desenvolvedor à ferramenta?
Como dito, eu não tenho uma boa argumentação em relação a afirmação realizada, mas tenho perguntas que me levam a questionar se não seria uma má prática enviar objetos emaranhados para o cliente desenrolar.
Quais contextos?
Eu posso levantar a questão da padronização.
Se o cliente e o servidor compreendem a padronização, a comunicação é mais suave.
Isso é interessante pois no presente tópico não existe uma padronização:
Além disso é mais fácil ler e percorrer uma matriz/tabela do que um mapeamento.
Cabe esclarecer que a tabela proposta é parte de uma response composta por mais chaves.
Fiz um mock (58 linhas) de uma consulta mais complexa, cuja saida no Postmam é a seguinte:
function asString(json){
return JSON.stringify(json);
}
function parseJson(data){
return JSON.parse(data);
}
function Response(data){
data = parseJson(data);
let response = {
details: data.details,
status: data.status,
succes: data.status == "SUCCESS",
notFound: data.status == "NOT_FOUND",
}
if(data.table){
response.colsNames = data.table.colsNames;
response.rows = data.table.rows;
}
return response;
}
function Comprador(data){
let comprador = {
"id": data[0],
"nome":data[1],
"idade":data[2],
"sexo":data[3]
}
return comprador;
}
if(responseCode.code >= 200 && responseCode.code <= 299){
let response = Response(responseBody);
let rows = response.rows;
rows.forEach((row) => {
let comprador = Comprador(row[7]);
console.log(asString(comprador));
});
}
Então, a resposta para a utilização em outros contextos é:
depende de como os dados são manipulados.
Por exemplo, a função que extrai os dados do comprador e retorna um JSON.
@PedreiroDeSoftware Obrigado pela resposta. Eu também não tenho argumentos porque como foi uma pessoa mais experiente que eu, eu não questionei, mas obrigado pela explicação, vou levar em conta das proximas vezes.