Группировать массив объектов по одному элементу, за которым следует другой элемент - PullRequest
1 голос
/ 21 июня 2019

Я хочу создать список чата, в котором он будет сгруппирован по непрочитанным сообщениям с последующей датой (в формате эпохи)

const myData = {
  "4072b701-a799-4951-be60-3f2d461bf482": {
    "id": "4072b701-a799-4951-be60-3f2d461bf482",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "Glad to connect!",
    "timestamp": "2019-06-18T04:30:56.188Z",
    "isOwner": false,
    "isRead": true
  },
  "1b2c0e15-a3b3-4994-8fda-e38e3cdc8d05": {
    "id": "1b2c0e15-a3b3-4994-8fda-e38e3cdc8d05",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "We have offices in San Jose, CA, Malaysia, Singapore and India",
    "timestamp": "2019-06-18T04:30:58.189Z",
    "isOwner": false,
    "isRead": true
  },
  "9613038a-b78a-4afe-aa2d-71d1a8292ec7": {
    "id": "9613038a-b78a-4afe-aa2d-71d1a8292ec7",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "Ask away, or select from below options",
    "timestamp": "2019-06-18T04:30:58.190Z",
    "isOwner": false,
    "isRead": true
  },
  "d409a190-6278-490b-9bf6-f3489b0a1cb5": {
    "id": "d409a190-6278-490b-9bf6-f3489b0a1cb5",
    "from": "b740849b-7553-4ddc-945e-b986aff854bb",
    "to": "BOT",
    "message": "this",
    "timestamp": "2019-06-18T04:32:55.356Z",
    "isOwner": true,
    "isRead": true
  },
  "acfc975f-f522-472d-a1f4-18a737da00f2": {
    "id": "acfc975f-f522-472d-a1f4-18a737da00f2",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "Glad to connect!",
    "timestamp": "2019-06-20T22:50:29.714Z",
    "isOwner": false,
    "isRead": false
  },
  "d409a190-6278-490b-9bf6-f3489b0a1cb5": {
    "id": "d409a190-6278-490b-9bf6-f3489b0a1cb5",
    "from": "b740849b-7553-4ddc-945e-b986aff854bb",
    "to": "BOT",
    "message": "this",
    "timestamp": "2019-06-21T04:32:55.356Z",
    "isOwner": true,
    "isRead": false
  },
};
const newObj = Object.keys(myData)
  .map(objId => myData[objId])
  .reduce((acc, value) => {
    const date = value.timestamp;
    if (!acc[date]) {
      acc[date] = [];
    }
    acc[date].push(value);

    return acc;
  }, {});

console.log(newObj);

Как вы можете видеть, я все еще не отсортировал метку времени должным образом.Поэтому я пропустил группировку флага isRead, и я действительно хочу переменную даты в формате эпохи и сохраняю только дату

Я ожидаю, что выходные данные будут такими:

{
   read: {
     1489520157124: [{...}], // this is dummy epoch time
     1489520157154: [{...}]
   },
   unread: {
     1489520157124: [{...}], // this is dummy epoch time
     1489520157154: [{...}]
   }
}

1 Ответ

1 голос
/ 21 июня 2019

Добавьте свойства read и unread к объекту-аккумулятору и поместите объект в соответствующее свойство.

Используйте Date.parse() для преобразования метки времени в время эпохи.

const myData = {
  "4072b701-a799-4951-be60-3f2d461bf482": {
    "id": "4072b701-a799-4951-be60-3f2d461bf482",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "Glad to connect!",
    "timestamp": "2019-06-18T04:30:56.188Z",
    "isOwner": false,
    "isRead": true
  },
  "1b2c0e15-a3b3-4994-8fda-e38e3cdc8d05": {
    "id": "1b2c0e15-a3b3-4994-8fda-e38e3cdc8d05",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "We have offices in San Jose, CA, Malaysia, Singapore and India",
    "timestamp": "2019-06-18T04:30:58.189Z",
    "isOwner": false,
    "isRead": true
  },
  "9613038a-b78a-4afe-aa2d-71d1a8292ec7": {
    "id": "9613038a-b78a-4afe-aa2d-71d1a8292ec7",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "Ask away, or select from below options",
    "timestamp": "2019-06-18T04:30:58.190Z",
    "isOwner": false,
    "isRead": true
  },
  "d409a190-6278-490b-9bf6-f3489b0a1cb5": {
    "id": "d409a190-6278-490b-9bf6-f3489b0a1cb5",
    "from": "b740849b-7553-4ddc-945e-b986aff854bb",
    "to": "BOT",
    "message": "this",
    "timestamp": "2019-06-18T04:32:55.356Z",
    "isOwner": true,
    "isRead": true
  },
  "acfc975f-f522-472d-a1f4-18a737da00f2": {
    "id": "acfc975f-f522-472d-a1f4-18a737da00f2",
    "from": "BOT",
    "to": "b740849b-7553-4ddc-945e-b986aff854bb",
    "message": "Glad to connect!",
    "timestamp": "2019-06-20T22:50:29.714Z",
    "isOwner": false,
    "isRead": false
  },
  "d409a190-6278-490b-9bf6-f3489b0a1cb5": {
    "id": "d409a190-6278-490b-9bf6-f3489b0a1cb5",
    "from": "b740849b-7553-4ddc-945e-b986aff854bb",
    "to": "BOT",
    "message": "this",
    "timestamp": "2019-06-21T04:32:55.356Z",
    "isOwner": true,
    "isRead": false
  },
};
const newObj = Object.values(myData)
  .reduce((acc, value) => {
    const date = Date.parse(value.timestamp);
    const prop = value.isRead ? "read" : "unread";
    if (!acc[prop][date]) {
      acc[prop][date] = [];
    }
    acc[prop][date].push(value);

    return acc;
  }, {read: {}, unread: {}});

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