我想填充orders它是一個型別的陣列Order。預期的結果是orders=[{id:1,qt:4},{id:2, qt:2},{id:3,qt:2}]。如何在 TypeScript 中做到這一點?我是新手。
export class Product {
constructor(public id: number, public name: string, public price: number) {}
}
export interface Order {
id: number;
qt: number;
}
export const products: Product[] = [
new Product(1, 'Apple', 2.1),
new Product(2, 'Banana', 2.2),
new Product(3, 'Chocolate', 2.3),
new Product(4, 'Dessert', 2.4),
];
export const cart: Product[] = [
products[0],
products[0],
products[2],
products[1],
products[2],
products[0],
products[1],
products[0],
];
export const orders: Order[] = [];
編輯
對于那些想知道如何
orders=[{id:1,qt:4},{id:2, qt:2},{id:3,qt:2}]獲得的人。
在cart:
- 蘋果的數量 (
id:1) 是qt:4 - 香蕉的數量 (
id:2) 是qt:2 - 巧克力的數量 (
id:3) 是qt:2
因此,通過使用購物車,我必須獲得orders=[{id:1,qt:4},{id:2, qt:2},{id:3,qt:2}]. 應該很清楚。
uj5u.com熱心網友回復:
既然你正在尋找一個“LINQ樣”的解決方案,你可能想使用更高階的功能,如map/ filter/ reduce。
嚴格來說,您的問題不能完全用 LINQ 投影解決。那些僅代表map(Select)、concatMap/ flatMap(SelectMany)和zip(Zip)。您的問題涉及計算id整個陣列中每個出現的次數。
幾乎每個資料操作問題都可以通過更高階的折疊來解決,即reduce在 javascript 領域,Aggregate在 C# 領域。這個也不例外。首先要做的是計算each 的出現次數id,并構建一個 counter 物件。
cart.reduce((acc, { id }) => {
acc[id] = (acc[id] ?? 0) 1;
return acc;
}, {} as Record<number, number>);
本質上,您從一個空物件開始折疊操作,然后添加每個物件id及其出現次數。每次id在cart陣列中遇到an時,都會增加它在物件中的計數。如果id不存在于累積物件中,則無效合并 ( acc[id] ?? 0) 使用0并增加它。
這會給你——
{ '1': 4, '2': 2, '3': 2 }
現在,你需要把它變成——
[ { id: 1, qt: 4 }, { id: 2, qt: 2 }, { id: 3, qt: 2 } ]
為此,Object.entries在折疊結果上使用以獲得-
> Object.entries({ '1': 4, '2': 2, '3': 2 })
[ [ '1', 4 ], [ '2', 2 ], [ '3', 2 ] ]
最后,一個簡單的map就是你所需要的——
Object.entries(...).map(([id, qt]) => ({ id: Number(id), qt }))
結合所有這些,你有——
export const orders: Order[] = Object.entries(
cart.reduce((acc, { id }) => {
acc[id] = (acc[id] ?? 0) 1;
return acc;
}, {} as Record<number, number>)
).map(([id, qt]) => ({ id: Number(id), qt }));
這里要注意的一件事Object.entries是效率非常低,因為它構建了一個陣列而不是迭代器。如果您想提高效率Object.entries,請使用生成器函式滾動迭代器版本并使用它-
function* objEntries<T>(x: Record<string, T>): IterableIterator<[string, T]> {
for (const k in x) {
yield [k, x[k]];
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/351382.html
標籤:javascript 打字稿
下一篇:關于不應發生的文本重定向的問題
