javascript - Gruparea valorilor înnăbușite dintr-un array folosind reduce


Trebuie să grupezi array-ul după o valoare înnăbușită type.Id. Cum să schimb funcția curentă groupby pentru a realiza acest lucru. Funcția curentă va grupa folosind productName sau Price. Trebuie să grupezi folosind o valoare înnăbușită type.id. Orice ajutor ar fi foarte apreciat!

Grupare după funcție

static groupBy<T>(data: T[], key: string): T[] {
        return <T[]>data.reduce((a, b) => {
            (a[b[key]] = a[b[key]] || []).push(x);
            return <T[]>a;
        }, {});
    }

valoare exemplu:

var sales = [
{
   "productName": "AAA",
   "type": {
       "id": 1,
       "name": "Soap"
   },
   "price": 90
},
{
   "productName": "BBB",
   "type": {
       "id": 1,
       "name": "Soap"
   },
   "price": 85
},
{
   "productName": "CCC",
   "type": {
       "id": 1,
       "name": "Soap"
   },
   "price": 55
},
{
   "productName": "DDD",
   "type": {
       "id": 2,
       "name": "shampoo"
   },
   "price": 2
},
{
   "productName": "EEE",
   "type": {
       "id": 2,
       "name": "shampoo"
   },
   "price": 5
}
]

Rezultat așteptat:

{1}, 
[
{
   "productName": "AAA",
   "type": {
       "id": 1,
       "name": "Soap"
   },
   "price": 90
},
{
   "productName": "BBB",
   "type": {
       "id": 1,
       "name": "Soap"
   },
   "price": 85
},
{
   "productName": "CCC",
   "type": {
       "id": 1,
       "name": "Soap"
   },
   "price": 55
}],

{2},[
{
   "productName": "DDD",
   "type": {
       "id": 2,
       "name": "shampoo"
   },
   "price": 2
},
{
   "productName": "EEE",
   "type": {
       "id": 2,
       "name": "shampoo"
   },
   "price": 5
}
]

Răspuns #1

Adăugați o funcție de acces pentru a utiliza proprietăți la orice nivel de adâncime,

function groupBy<T>(data: T[], key: string): T[] {

  const path: string[] = key.split('.');
  const accessor = (obj: T) => path.reduce((x,y) => x[y], obj)

  return <T[]>data.reduce((a, b) => {
    const value = accessor(b).toString();  
    (a[value] = a[value] || []).push(b);
    return <T[]>a;
  }, {});
}
console.log(groupBy(sales, 'type.id'))

Versiune JS executabilă

const sales = [
  {
    "productName": "AAA",
    "type": {
      "id": 1,
      "name": "Soap"
    },
    "price": 90
  },
  {
    "productName": "BBB",
    "type": {
      "id": 1,
      "name": "Soap"
    },
    "price": 85
  },
  {
    "productName": "CCC",
    "type": {
      "id": 1,
      "name": "Soap"
    },
    "price": 55
  },
  {
    "productName": "DDD",
    "type": {
      "id": 2,
      "name": "shampoo"
    },
    "price": 2
  },
  {
    "productName": "EEE",
    "type": {
      "id": 2,
      "name": "shampoo"
    },
    "price": 5
  }
]

function groupBy(data, key) {

  const path = key.split('.');
  const accessor = (obj) => {
    return path.reduce((x,y) => {
      return x[y]
    }, obj).toString();
  }

  return data.reduce((a, b) => {
    const prop = accessor(b);
    (a[prop] = a[prop] || []).push(b);
    //a[prop] = a[prop] || [];
    //a[prop].push(b);
    return a;
  }, {});
}

console.log(groupBy(sales, 'type.id'))