Группировать объекты на основе пользователя в Javascript - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь сгруппировать большой объем данных, полученных из базы данных, в отдельные объекты на основе пользователя.

Данные, которые я получаю, выглядят так:

[ { ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:19.960Z },
  { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:24.179Z },
  { ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:18.249Z },
  { ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:11.230Z },
  { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 0,
    created: 2018-05-02T11:33:34.705Z },
  { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:00.049Z },
  { ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:04.269Z },
  { ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:02.365Z }
]

но я бы хотел, чтобы выходные данные функции были сгруппированы по тому же идентификатору, как этот

[[{ ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:19.960Z },
{ ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:04.269Z },
  { ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:02.365Z }
],
[
  { ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:18.249Z },
  { ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:11.230Z }
],
[
  { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:24.179Z },
  { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 0,
    created: 2018-05-02T11:33:34.705Z },
  { ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 13.450980186462402,
    created: 2018-05-02T13:21:00.049Z }
]]

Какой самый эффективный способ сделать это в JavaScript?

Я нашел функцию, которая выглядит так

function groupUserMood(xs, key) {
    return xs.reduce(function(rv, x) {
      (rv[x[key]] = rv[x[key]] || []).push(x);
      return rv;
    }, {});
  };

Но это также добавляет похожие вещи, которые я бы не хотел.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вы можете сгруппировать их так:

const group = arr.reduce((acc, item) => {
  if (!acc[item.ID]) {
    acc[item.ID] = [];
  }

  acc[item.ID].push(item);
  return acc;
}, {});

const result = Object.values(group);

Ваш желаемый результат будет в переменной result.

0 голосов
/ 04 мая 2018

Проблема сохранения промежуточного индекса может быть решена разными способами. Например, так:

var result = []
var keys = {}
data.forEach(function (e) {
  if (typeof keys[e.ID] === 'undefined') {
    result.push([])
    keys[e.ID] = result.length - 1
  }
  result[keys[e.ID]].push(e)
})

[https://jsfiddle.net/d0c41Lc8/]

0 голосов
/ 04 мая 2018

Используйте .reduce для группировки по идентичным ID с, а затем Object.values для извлечения массивов:

const input = [{
    ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
  },
  {
    ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 13.450980186462402,
  },
  {
    ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b',
    value: 13.450980186462402,
  },
  {
    ID: '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b',
    value: 13.450980186462402,
  },
  {
    ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 0,
  },
  {
    ID: '5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9',
    value: 13.450980186462402,
  },
  {
    ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
  },
  {
    ID: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
    value: 13.450980186462402,
  }
];
const groupedInputObj = input.reduce((accum, item) => {
  const { ID } = item;
  if (!accum[ID]) accum[ID] = [];
  accum[ID].push(item);
  return accum;
}, {});
const output = Object.values(groupedInputObj);
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...