我有一个数组products
,需要按Product._shop_id
进行分组。
export class Product {
_id: string;
_shop_id: string;
}
export class Variant { variant_id: string; }
export interface ShoppingCart {
Variant: Variant;
Product: Product;
quantity: number;
totalPrice: number;
}
export class CartComponent implements OnInit {
products: ShoppingCart[] = [];
ngOnInit(){
this.products = [
{Variant: {variant_id: '1'}, Product: {_id: '1', _shop_id:'1'}, quantity: 5, totalPrice: 600},
{Variant: {variant_id: '2'}, Product: {_id: '2', _shop_id:'2'}, quantity: 4, totalPrice: 500},
{Variant: {variant_id: '5'}, Product: {_id: '3', _shop_id:'2'}, quantity: 3, totalPrice: 400}
]
}
someMethod(){
const productsByShop = this.utils.groupBy(this.products, key);
}
}
这是实现此目的的方法。但是我需要对象密钥才能使其正常工作。
export class Utils {
constructor() { }
groupBy(list, key) {
const map = new Map();
list.forEach((item) => {
const collection = map.get(key);
if (!collection) {
map.set(key, [item]);
} else {
collection.push(item);
}
});
return Array.from(map)[0][1];
}
}
我正在尝试从_shop_id
数组中按products
分组的不同数组。
像这样:
array1: [ {Variant: {variant_id: '1'}, Product: {_id: '1', _shop_id:'1'}, quantity: 5, totalPrice: 600} ]`
array2: [ {Variant: {variant_id: '2'}, Product: {_id: '2', _shop_id:'2'}, quantity: 4, totalPrice: 500},
{Variant: {variant_id: '5'}, Product: {_id: '3', _shop_id:'2'}, quantity: 3, totalPrice: 400} ]`
答案 0 :(得分:2)
由于您的_shop_id
属于嵌套对象,因此最好传递一个lambda来提取它:
someMethod(){
const productsByShop = this.utils.groupBy(this.products,
(product) => product.Product._shop_id);
}
// ...
export class Utils {
constructor() { }
groupBy<T, K>(list: T[], getKey: (item: T) => K) {
const map = new Map<K, T[]>();
list.forEach((item) => {
const key = getKey(item);
const collection = map.get(key);
if (!collection) {
map.set(key, [item]);
} else {
collection.push(item);
}
});
return Array.from(map.values());
}
}