Как сгруппировать массив объектов на основе нескольких ключей в Javascript? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть массив следующим образом

 [
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 1,
    "PostalCodeType": "ShipToCustomer",
    "TimeStart": "1970-01-01T06:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 1,
    "PostalCodeType": "ShipToCustomer",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 1,
    "PostalCodeType": "ShipToCustomer",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T05:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 2,
    "PostalCodeType": "ShipToCustomer",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 2,
    "PostalCodeType": "ShipToCustomer",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 3,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 3,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 4,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 4,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 5,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T16:22:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 5,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T16:23:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 6,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 6,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 1,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T06:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 1,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 1,
    "ShippingCarrierId": 1,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T05:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 2,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T00:00:00.000Z",
    "TimeEnd": "1970-01-01T15:59:00.000Z",
    "PickupTimeSlot": "PM",
    "DaysToAdd": 0,
    "PickupTime": "1970-01-01T17:00:00.000Z"
  },
  {
    "WarehouseId": 2,
    "ShippingCarrierId": 2,
    "PostalCodeType": "ShipToDS",
    "TimeStart": "1970-01-01T16:00:00.000Z",
    "TimeEnd": "1970-01-01T23:59:00.000Z",
    "PickupTimeSlot": "AM",
    "DaysToAdd": 1,
    "PickupTime": "1970-01-01T11:00:00.000Z"
  }
]

Я хочу сгруппировать его по WarehouseId, ShippingCarrierId и PostalCodeType.Каждый объект будет иметь массив объектов chlid для Timestart, TimeEnd и т.д.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Вы можете использовать функцию groupBy из lodash - https://lodash.com/docs/4.17.11#groupBy

let groupBy = _.groupBy(array, 'WarehouseId');

Дает вам ->

wareHouseId1: [...], 
wareHouseId2: [...]

Многоуровневая группировка не поддерживается библиотекой.

0 голосов
/ 11 февраля 2019

Вы можете создать объект-аккумулятор с новым ключом для каждой уникальной комбинации этих трех ключей, разделенных -.Затем на основе этого нового ключа объедините массив, используя reduce.Используйте destructuring , чтобы разделить нужные вам ключи в переменной PickupTimeSlots и rest.Затем используйте Object.values, чтобы получить окончательный массив:

const slots=[{"WarehouseId":1,"ShippingCarrierId":1,"PostalCodeType":"ShipToCustomer","TimeStart":"1970-01-01T06:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":1,"PostalCodeType":"ShipToCustomer","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":1,"PostalCodeType":"ShipToCustomer","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T05:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":0,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":2,"PostalCodeType":"ShipToCustomer","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":2,"PostalCodeType":"ShipToCustomer","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":3,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":3,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":4,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":4,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":5,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T16:22:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":5,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T16:23:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":6,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":6,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":1,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T06:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":1,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":1,"ShippingCarrierId":1,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T05:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":0,"PickupTime":"1970-01-01T11:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":2,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T00:00:00.000Z","TimeEnd":"1970-01-01T15:59:00.000Z","PickupTimeSlot":"PM","DaysToAdd":0,"PickupTime":"1970-01-01T17:00:00.000Z"},{"WarehouseId":2,"ShippingCarrierId":2,"PostalCodeType":"ShipToDS","TimeStart":"1970-01-01T16:00:00.000Z","TimeEnd":"1970-01-01T23:59:00.000Z","PickupTimeSlot":"AM","DaysToAdd":1,"PickupTime":"1970-01-01T11:00:00.000Z"}]

const merged = slots.reduce((r, { WarehouseId, ShippingCarrierId, PostalCodeType,...rest }) => {
  const key = `${WarehouseId}-${ShippingCarrierId}-${PostalCodeType}`;
  r[key] = r[key] || { WarehouseId, ShippingCarrierId, PostalCodeType, PickupTimeSlots: [] };
  r[key]["PickupTimeSlots"].push(rest)
  return r;
}, {})

const timeTable = Object.values(merged)
console.log(timeTable)
0 голосов
/ 11 февраля 2019

Вы можете использовать уменьшить , чтобы решить эту проблему

let groupBy = function(array, key) {
  return array.reduce(function(result, item) {
    (result[item[key]] = result[item[key]] || []).push(item);
    return result;
  }, {});
};

console.log(groupBy(yourarray, 'yourkey'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...