Javascript-在每个循环中制作对象并增加数组中的计数

时间:2018-07-11 01:23:20

标签: javascript arrays object

我试图通过javascript中的forEach循环创建一个对象,并且在这个简单的对象中,我试图为数组中的每个项目加总所有count

当前,我在一个离子(角度/打字稿)项目中使用firebase,并且正在从firebase返回一系列项目。数组看起来像这样:

[
    {
        id:'uniqueID',
        specs: {
            count:5,
            forSale:false,
            group:"qPELnTnwGJEtJexgP2qX",
            name:"Foxeer Cam 2",
            type:"camera"
        }
    },
    {
        id:'uniqueID',
        specs: {
            count:4,
            forSale:false,
            group:"qPELnTnwGJEtJexgP2qX",
            name:"Furibee 40a",
            type:"esc"
        }
    },
    {
        id:'uniqueID',
        specs: {
            count:4,
            forSale:false,
            group:"qPELnTnwGJEtJexgP2qX",
            name:"Runcam Cam 1",
            type:"camera"
        }
    },
    {
        id:'uniqueID',
        specs: {
            count:1,
            forSale:false,
            group:"qPELnTnwGJEtJexgP2qX",
            name:"Hobbywing 4 in 1",
            type:"esc"
        }
    }
]

这是我运行这些项目的方式(result是项目列表):

let partArr = [];
let typeObj = {};
result.forEach(part => {

  //Put all parts in a list
  partArr.push({
    'id':part.id,
    'specs':part.data(),
  });

  //Put all types in a list
  typeObj[part.data().type] = {
    'count': 0
  };

});

现在,我需要增加计数,根据零件的类型将每个零件的计数加到最后。 typeObj应该看起来像这样。

{
    esc: {
        count:5
    },
    camera: {
        count:10
    }
}

我尝试将计数添加到计数中,如下所示:

  typeObj[part.data().type] = {
    'count': typeObj[part.data().type].count + part.data().count
  };

,但是当我第一次制作该对象时,它无法识别计数。 (我认为)。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

使用reduce一次生成具有所有计数的对象,并且每次迭代仅调用一次.data()可能会更容易:

const results = [
  {
    data() { return { specs: {
    count:5,
    forSale:false,
    group:"qPELnTnwGJEtJexgP2qX",
    name:"Foxeer Cam 2",
    type:"camera"
  }}}},
  {
    data() { return { specs: {
    count:4,
    forSale:false,
    group:"qPELnTnwGJEtJexgP2qX",
    name:"Furibee 40a",
    type:"esc"
  }}}},
  {
    data() { return { specs: {
    count:4,
    forSale:false,
    group:"qPELnTnwGJEtJexgP2qX",
    name:"Runcam Cam 1",
    type:"camera"
  }}}},
  {
    data() { return { specs: {
    count:1,
    forSale:false,
    group:"qPELnTnwGJEtJexgP2qX",
    name:"Hobbywing 4 in 1",
    type:"esc"
  }}}}
];
const typeObj = results.reduce((a, item) => {
  const { count, type } = item.data().specs;
  if (!a[type]) a[type] = { count: 0 };
  a[type].count += count;
  return a;
}, {});
console.log(typeObj);

答案 1 :(得分:1)

您可以使用Array#reduce完成此操作,因为您要将数组转换为单个对象:

const array = [
  {
    id: 'uniqueID',
    specs: {
      count: 5,
      forSale: false,
      group: "qPELnTnwGJEtJexgP2qX",
      name: "Foxeer Cam 2",
      type: "camera"
    }
  },
  {
    id: 'uniqueID',
    specs: {
      count: 4,
      forSale: false,
      group: "qPELnTnwGJEtJexgP2qX",
      name: "Furibee 40a",
      type: "esc"
    }
  },
  {
    id: 'uniqueID',
    specs: {
      count: 4,
      forSale: false,
      group: "qPELnTnwGJEtJexgP2qX",
      name: "Runcam Cam 1",
      type: "camera"
    }
  },
  {
    id: 'uniqueID',
    specs: {
      count: 1,
      forSale: false,
      group: "qPELnTnwGJEtJexgP2qX",
      name: "Hobbywing 4 in 1",
      type: "esc"
    }
  }
];
const typeObj = array.reduce((obj, { specs: { count, type } }) => {
  obj[type] = obj[type] || { count: 0 };
  obj[type].count += count;
  return obj;
}, {});
console.log(typeObj);

这是将obj[type]分配给它本身,或者如果尚不存在,则分配一个新对象{ count: 0 }。然后,它将count的{​​{1}}属性增加数据中的指定计数。

如果您有一个obj[type]方法返回带有数据的对象(就像您在问题中所看到的那样),则可以像这样修改它:

data