分解对象字段并计算Java中的总和

时间:2019-08-06 23:16:13

标签: javascript arrays object ecmascript-6 filter

我在弄清楚如何解构对象并将其总和与字段加在一起时遇到麻烦。以前,我们破坏对象数组中的单独对象。现在,它们被汇总为1个对象,看起来像这样:

{
  "3" {
   petIds:{
    "113": {"estimatedEats": 10, "owners": {"female":{"kids":1, "adult":2, "senior":10}}, "male":{"kids":1, "adult":2, "senior":10}}
     "9": {"estimatedEats": 1, owners: {…}}}

  "6":{
   petIds:{
     "113": {"estimatedEats": 5, "owners": {…}}
     "9": {"estimatedEats": 6, "owners": {…}}
     "1": {"estimatedEats": 7, "owners": {…}}}
  }

以前,我可以映射对象数组。我想结束一个看起来像这样的对象数组:

[{petIds:113, "estimatedEats":15, "owners": (sum of owner description)}...]

有没有一种方法可以将每个字段转换为对象数组?我认为这样做并映射数组会更容易。

2 个答案:

答案 0 :(得分:0)

这应该让您入门:

var x = {
  3:{
   petIds:{
    113: {estimatedEats: 10, owners: {}},
     9: {estimatedEats: 1, owners: {}}
   }
  },
  6:{
   petIds:{
     113: {"estimatedEats": 5, "owners": {}},
     9: {"estimatedEats": 6, "owners": {}},
     1: {"estimatedEats": 7, "owners": {}}
   }
  }
};

var pets = [];
Object.keys(x).forEach(function(key) {
    var y = x[key];
    Object.keys(y).forEach(function(objKey) {
        if(objKey === 'petIds'){
          var z = y[objKey];
          Object.keys(z).forEach(function(petKey) {
            var pet = Object.assign({},z[petKey]);
            pet.id = parseInt(petKey);
            pets.push(pet);
          });
        };
    });
});

var sumPets = [];

pets.forEach(function(p){
  var idx = sumPets.findIndex(function(i){
    return i.id === p.id;
  });

  if(idx < 0){
    sumPets.push(p);
  } else {
    sumPets[idx].estimatedEats = sumPets[idx].estimatedEats + p.estimatedEats;
  }
});

console.log(sumPets);

答案 1 :(得分:0)

我不太确定我是否理解您要达到的目标,但是我会尽力回答:)

  

有没有一种方法可以将每个字段转换为对象数组?我认为这样做并映射数组会更容易。

Object.values创建一个包含对象所有值的数组。那是你要找的吗?

这是一个codepen,其中我使用estimatedEatsObject方法求和Array。我认为您也可以基于此总结其他属性。

const data = {
  3: {
    petIds: {
      113: {
        estimatedEats: 10,
        owners: { female: { kids: 1, adult: 2, senior: 10 } },
        male: { kids: 1, adult: 2, senior: 10 }
      },
      1: {
        estimatedEats: 120,
        owners: { female: { kids: 1, adult: 2, senior: 10 } },
        male: { kids: 1, adult: 2, senior: 10 }
      }
    }
  },
  6: {
    petIds: {
      113: {
        estimatedEats: 5,
        owners: { female: { kids: 1, adult: 2, senior: 10 } },
        male: { kids: 1, adult: 2, senior: 10 }
      },
      1: {
        estimatedEats: 5,
        owners: { female: { kids: 1, adult: 2, senior: 10 } },
        male: { kids: 1, adult: 2, senior: 10 }
      }
    }
  }
};

const groupedById = Object.values(data).reduce((acc, { petIds }) => {
  Object.entries(petIds).forEach(([key, value]) => {
    acc[key] = acc[key] || [];
    acc[key].push(value);
  });
  return acc;
}, {});

const summedUp = Object.entries(groupedById).map(
  ([key, value]) =>
    value.reduce(
      (acc, row) => {
        acc.estimatedEats += row.estimatedEats;
        return acc;
      },
      { estimatedEats: 0, petIds: key }
    ),
  []
);

console.log("Result:", summedUp);

更新:也将代码粘贴到我的答案中。