如何解决遍历Typescript
我有一个对象,该对象具有通过lodash groupBy函数映射的分组数据, 遍历集合并检索以下信息的最佳方法是什么:
- totalProductNumber,
- totalProductSum = Sum(productsNumberInGroup * 价格)
- productsNumberPerGroup
所以输出可能是
let result = {
totalProductNumber: 8,totalProductSum: 17,productsNumberPerGroup: [{1:2},{2:3},{3:3}] // or sth. like this
}
interface IProduct {
name: string;
color: string;
price: string;
id: number
}
const products = {
"1": [{
"name": "Jim","color": "blue","price": 1,"id": 1
},{
"name": "Jim","id": 1
}
],"2": [{
"name": "Eddie","color": "green","price": 2,"id": 2
},{
"name": "Eddie","id": 2
}
],"3": [{
"name": "Ela","color": "pink","price": 3,"id": 3
},{
"name": "Ela","id": 3
}
]
}
我的假设是使用Object.entries或Object.values
let totalSum: number;
let totalPrices: number[];
Object.values(products)
.map((prod) => {
(prod as IProduct[]).map((p) => {
this.totalPrices.push(Number(p.price)); // here getting Cannot read property 'push' of undefined
});
});
解决方法
您应该进行两项更改
let totalPrices: number[];
到
let totalPrices: number[] = [];
界面的另一个变化
interface IProduct {
name: string;
color: string;
price: string;
id: number
}
更改
price: string;
到
price: number;
,
具有可变风格
interface IProduct {
name: string
color: string
price: number
id: number
}
type Products = Record<string,IProduct[]>
const products: Products = { ... }
let totalProductNumber = 0
let totalProductSum = 0
let productsNumberPerGroup: [string,number][] = []
Object.entries(products).map(([grpId,grpProducts]) => {
totalProductNumber = totalProductNumber + grpProducts.length
totalProductSum = totalProductSum + grpProducts.reduce((acc,curr) => acc + curr.price,0)
productsNumberPerGroup = [...productsNumberPerGroup,[grpId,grpProducts.length]]
})
console.log(totalProductNumber) // 8
console.log(totalProductSum) // 17
console.log(productsNumberPerGroup) //[ [ '1',2 ],[ '2',3 ],[ '3',3 ] ]
风格不变
type Result = [
totalProductNumber: number,totalProductSum: number,productsNumberPerGroup: [string,number][]
]
const initial: Result = [0,[]]
const [totalNum,totalSum,prdPerGrp] = Object.entries(products).reduce<Result>(
([num,sum,perGrp],grpProducts]) => {
return [
num + grpProducts.length,sum + grpProducts.reduce((acc,0),[...perGrp,grpProducts.length]]
]
},initial
)
console.log(totalNum) // 8
console.log(totalSum) // 17
console.log(prdPerGrp) // [ [ '1',3 ] ]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。