我试图通过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
};
,但是当我第一次制作该对象时,它无法识别计数。 (我认为)。
有什么建议吗?
答案 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