0 / 0 / 0
Регистрация: 29.06.2014
Сообщений: 19
1

Группировка массива. Переписать с JS

13.07.2020, 10:12. Показов 517. Ответов 2

Написал простенький алгоритм группировки массива на JS. Перепишите его, пожалуйста, на C++ ... так как это делают люди, которые знают C++.
Я пока поверхностно вникаю, но уже чувствую, что писать sizeof(value)/sizeof(double) для определения длинны массива как-то странно :-)

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
 * Group items by field
 *
 * items =
 *   [{id: 1, name: 'A', i: 1}, {id: 2, name: 'B', i: 2}, {id: 3, name: 'A', i: 3}, {id: 4, name: 'B', i: 4}, {id: 5, name: 'A', i: 5}]
 *
 * groupByField(items, 'name', ['i']) =
 *   [
 *     {
 *       groupField: 'name',
 *       groupValue: 'A',
 *       items: [{id: 1, name: 'A', i: 1}, {id: 3, name: 'A', i: 3}, {id: 5, name: 'A', i: 5}],
 *       id: 1, //First value
 *       i: 9   //Summed value
 *     }, {
 *       groupField: 'name',
 *       groupValue: 'B',
 *       items: [{id: 2, name: 'B', i: 2}, {id: 4, name: 'B', i: 4}],
 *       id: 2,
 *       i: 6
 *     }
 *   ]
 *
 * @param items - Array<any> - items array
 * @param field - string - field name
 * @param sumFields - Array<string> - array with names of fields which should be summed
 * @returns Array<any>
 */
function groupByField(items, field, sumFields = []) {
  const itemsByField = new Map() // We need correct order of items
  const sumReducer = (fieldName) => (prev, next) => (prev + next[fieldName] || 0);
  const result = [];
 
  for (let i = 0; i < items.length; i++) {
    const item = items[i];
    const groupKey = item[field];
    const groupedCollection = itemsByField.get(groupKey) || [];
 
    if (!groupedCollection.length) {
      itemsByField.set(groupKey, groupedCollection);
    }
 
    groupedCollection.push(item);
  }
 
  for (const entry of itemsByField) {
    const key = entry[0];
    const items = entry[1];
    const aggregatedItem = { ...items[0] }; // Copy first item
 
    // Calculate values which should be summed
    for (let j = 0; j < sumFields.length; j++) {
      const fieldName = sumFields[j];
 
      aggregatedItem[fieldName] = items.reduce(sumReducer(fieldName), 0)
    }
 
    aggregatedItem.groupField = field;
    aggregatedItem.groupValue = key;
    aggregatedItem.items = items;
 
    result.push(aggregatedItem);
  }
 
  return result;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2020, 10:12
Ответы с готовыми решениями:

Группировка массива
Имеется массив $array = , , , , ];

Группировка массива
Привет, помогите сгруппировать массив. вообщем есть значения (из бд). нужно сделать из него 4...

Группировка массива
Никак не сображу( Есть массив: $db = array( array (&quot;id&quot; =&gt; &quot;02003&quot;, &quot;name&quot; =&gt; &quot;A&quot;,...

Группировка массива
Необходимо сгруппировать по любому полю, которое я укажу в качестве параметра функции. К видите...

2
248 / 78 / 31
Регистрация: 29.03.2020
Сообщений: 498
13.07.2020, 11:29 2
Цитата Сообщение от silentland Посмотреть сообщение
писать sizeof(value)/sizeof(double) для определения длинны массива как-то странно
Если странно, то можно использовать std::vector и std::map
0
0 / 0 / 0
Регистрация: 29.06.2014
Сообщений: 19
13.07.2020, 13:18  [ТС] 3
Да и не в этом только дело. Тут нужно в целом на готовое решение взглянуть, а то по крупицам я пол года буду опыт собирать)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 13:18
Помогаю со студенческими работами здесь

Группировка ассоциативного массива по элементам
Как можно сгруппировать элементы массива, чтобы из: =&gt; Array ( =&gt; 15 ...

Группировка массива по общему свойству
Имеем массив, который содержит в себе свойство группировки для каждого товара. Несколько товаров...

Группировка элементов двумерного String-массива
Всем привет! Имеется двумерный string-массив с данными вида: { {&quot;дата_1&quot;, &quot;данные_1&quot;}, ...

Требуется переписать элементы массива a в массив b, удвоив все элементы, меньшие первого элемента, остальные переписать
Требуется переписать элементы массива a в массив b, удвоив все элементы, меньшие первого элемента,...

Многоуровневая группировка массива с подсчетом промежуточных сумм
Всем добрый день. Который день не могу придумать способа реализации следующей идеи: Есть...

Группировка массива по возрасту, имени или фамилии
Нужно написать функцию, которая будет группировать массив по возрасту, имени или фамилии. Функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru