如何将一个打字稿数组与该数组内对象的键分组?

时间:2018-08-15 03:07:30

标签: javascript arrays angular typescript

我有一个数组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} ]`

1 个答案:

答案 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());
    }
}