【问题标题】:How to add sum of object value and merge array object?如何添加对象值的总和并合并数组对象?
【发布时间】:2021-10-07 07:29:16
【问题描述】:

我有一个包含嵌套对象的数组,想要添加值的总和并在 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,
  },
},

];

我已经为一个对象做了,所以想要做多个对象

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(结果)

这里附上小提琴link

我出于“初步”价值而出局。我需要所有的对象意味着需要动态地做。提前致谢。

【问题讨论】:

  • 您的预期结果是什么?

标签: javascript arrays object ecmascript-6


【解决方案1】:

我们可以多次使用Array.reduce()结合Object.entries()在结构中添加正确层级的属性,最终结果应该符合要求:

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; }

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    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)

    【讨论】:

      【解决方案3】:
      • 使用Array#reduce,在更新对象累加器的同时迭代数组
        • 在每次迭代中,使用Object#keys,迭代手头对象的键
          • prev 设置为保存在累加器中的键的值(如果存在),并将current 设置为手头对象中的值
          • 如果在累加器中没有为该键保存以前的值,请将对象设置为它
          • 否则,使用 Object#keysArray#forEach 迭代其键并更新累加器

      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);

      【讨论】:

        【解决方案4】:

        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,
              },
              total: {
                contract_value: "7000.00",
                planned_value: "3500.00",
                balance_value: "3500.00",
              },
            },
            {
              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,
              },
              total: {
                contract_value: "700.00",
                planned_value: "350.00",
                balance_value: "350.00",
              },
            },
          ];
          
        
        const result = arr.reduce((obj, outerKeys) => {
          Object.keys(outerKeys).map((outerKey) => {
            // console.log(`outerKey:::`, outerKey);
            // console.log(`values[outerKey]:::`, outerKeys[outerKey]);
            // console.log(`obj:::`, obj);
            if (obj[outerKey]) {
              const tempObject = outerKeys[outerKey];
              Object.keys(tempObject).map((objKey) => {
                const tempInnerObject = obj[outerKey];
                tempInnerObject[objKey] =
                  Number(tempInnerObject[objKey]) + Number(tempObject[objKey]);
                // console.log(`objKey:::`, objKey);
                // console.log(`tempObject[objKey]:::`, tempObject[objKey]);
              });
            } else {
              obj[outerKey] = outerKeys[outerKey];
            }
          });
          return obj;
        }, {});
        console.log(`result :::`, result);

        【讨论】:

        • 我认为,这是一个让每个人都了解其他人的逻辑并改进你的逻辑构建的机会 :)
        猜你喜欢
        • 2019-06-13
        • 1970-01-01
        • 2019-03-16
        • 2016-09-05
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多