Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
How to add sum of object value and merge array object?

I have array with nested objects, want to add sum of value and make an object in javascript.

const arr = [
{
  preliminary: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
  substructure: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
  superstructure: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
  architectural: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
  mande: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
  externalwork: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
  miscorcontingency: {
    contract_value: 1000,
    planned_value: 500,
    balance_value: 500,
  },
},
{
  preliminary: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
  substructure: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
  superstructure: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
  architectural: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
  mande: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
  externalwork: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
  miscorcontingency: {
    contract_value: 100,
    planned_value: 50,
    balance_value: 50,
  },
},

];

I have done for one object, so want do multiple object

const result = arr.reduce(
(obj, { preliminary, ...rest }) => {
  return (
    Object.keys(preliminary).map(
      (key) =>
        (obj.preliminary[key] =
          preliminary[key] + (Number(obj.preliminary[key]) || 0))
    ),
    obj
  );
},
{
  preliminary: {},
  substructure: {},
  superstructure: {},
  architectural: {},
  mande: {},
  externalwork: {},
  miscorcontingency: {},
}

);

console.log(result)

Here I attach the fiddle link

I got out put for "preliminary" value. I need all of object mean needs to do dynamically. Thanks in advance.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

We can use Array.reduce() several times in combination with Object.entries() to add the properties at the correct level in the structure, the end result should be as required:

const arr = [ { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500, }, substructure: { contract_value: 1000, planned_value: 500, balance_value: 500, }, superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500, }, architectural: { contract_value: 1000, planned_value: 500, balance_value: 500, }, mande: { contract_value: 1000, planned_value: 500, balance_value: 500, }, externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500, }, miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500, }, }, { preliminary: { contract_value: 100, planned_value: 50, balance_value: 50, }, substructure: { contract_value: 100, planned_value: 50, balance_value: 50, }, superstructure: { contract_value: 100, planned_value: 50, balance_value: 50, }, architectural: { contract_value: 100, planned_value: 50, balance_value: 50, }, mande: { contract_value: 100, planned_value: 50, balance_value: 50, }, externalwork: { contract_value: 100, planned_value: 50, balance_value: 50, }, miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50, }, }]

const result = arr.reduce((acc, cur) => {
    return Object.entries(cur).reduce((acc, [key1, val1]) => {
        return Object.entries(val1).reduce((acc, [key2, val2]) => {
            acc[key1] = acc[key1] || {}; 
            acc[key1][key2] = (acc[key1][key2] || 0) + val2;
            return acc;
        }, acc)
    }, acc)
}, {})

console.log('Result:',result)
    
.as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Denunciar

0

  • Using Array#reduce, iterate over the array while updating an object accumulator
    • In every iteration, using Object#keys, iterate over the keys of the object at hand
      • Set prev to the the value of the key saved in the accumulator if exists, and current to the value in the object at hand
      • If no previous value was saved for this key in the accumulator set the object to it
      • Otherwise, using Object#keys and Array#forEach, iterate over its keys and update the accumulator

const arr = [
  { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    substructure: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    architectural: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    mande: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500 }
  },
  {
    preliminary: { contract_value: 100, planned_value: 50, balance_value: 50 },
    substructure: { contract_value: 100, planned_value: 50, balance_value: 50 },
    superstructure: { contract_value: 100, planned_value: 50, balance_value: 50 },
    architectural: { contract_value: 100, planned_value: 50, balance_value: 50 },
    mande: { contract_value: 100, planned_value: 50, balance_value: 50 },
    externalwork: { contract_value: 100, planned_value: 50, balance_value: 50 },
    miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50 }
  }
];

const res = arr.reduce((acc, obj) => {
  Object.keys(obj).forEach(key => {
    const prev = acc[key], current = obj[key];
    if(!prev) acc[key] = current;
    else Object.keys(current).forEach(k => prev[k] = (prev[k] || 0) + current[k]);
  });
  return acc;
}, {});

console.log(res);

about 4 years ago · Juan Pablo Isaza Denunciar

0

this is my solution:

const arr = [
  { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    substructure: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    architectural: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    mande: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500 },
    miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500 }
  },
  {
    preliminary: { contract_value: 100, planned_value: 50, balance_value: 50 },
    substructure: { contract_value: 100, planned_value: 50, balance_value: 50 },
    superstructure: { contract_value: 100, planned_value: 50, balance_value: 50 },
    architectural: { contract_value: 100, planned_value: 50, balance_value: 50 },
    mande: { contract_value: 100, planned_value: 50, balance_value: 50 },
    externalwork: { contract_value: 100, planned_value: 50, balance_value: 50 },
    miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50 }
  }
];

let result = arr.reduce((out, cv, ci)=>{
    if(ci == 0) return out;

    Object.keys(cv).forEach(key => {
        Object.keys(cv[key]).forEach(key2 => {
            (out[key] ??= {})[key2] += cv[key][key2];
        })
    });

    return out;

}, arr[0] );

console.log(result)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda