Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
47 / 1 / 0
Регистрация: 03.10.2018
Сообщений: 18

Сгруппировать элементы указанного массива по ключу и вернуть multimap ключей

03.10.2018, 14:54. Показов 9055. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите плиз, сгруппировать элементы указанного массива по ключу и вернуть multimap ключей, извлеченных из элементов массива через обратный вызов keySelector и значений, извлеченных с помощью обратного вызова valueSelector.
Решение нужно универсальное для массива с любыми названиями ключей.
На входе:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
group([
      { country: 'Belarus', city: 'Brest' },
      { country: 'Russia', city: 'Omsk' },
      { country: 'Russia', city: 'Samara' },
      { country: 'Belarus', city: 'Grodno' },
      { country: 'Belarus', city: 'Minsk' },
      { country: 'Poland', city: 'Lodz' }
     ], 
     item => item.country, 
     item => item.city
   )
Получить нужно:
JavaScript
1
2
3
4
5
 Map {
     "Belarus" => ["Brest", "Grodno", "Minsk"],
     "Russia" => ["Omsk", "Samara"], 
     "Poland" => ["Lodz"]
    }
Для данного массива я сделала следующее:

JavaScript
1
2
3
4
5
6
7
8
9
function group(myArray, keySelector, valueSelector) { 
  var group_to_values = myArray.reduce(function (obj, item) {
    obj[item.country] = obj[item.country] || [];
    obj[item.country].push(item.city);
    return obj;
  }, {});
 
  return Object.keys(group_to_values).map(key => [ key, group_to_values[key]]);
}
Но как правильно использовать в функции передаваемые item => item.country, item => item.city ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.10.2018, 14:54
Ответы с готовыми решениями:

Доступ к элементам multimap по ключу
Подскажите, как обратиться к элементам по ключу?

Multimap. Как получить кол-во элементов по ключу?
Есть ключ. Нужно получить кол-во элементо или диапозон значений по нему.

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

4
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
03.10.2018, 15:43
Лучший ответ Сообщение было отмечено Yannnaaa как решение

Решение

JavaScript
1
2
3
4
5
6
7
8
9
        function group(array, keySelector, valueSelector)
        {
            let keys = array.map(keySelector).filter((v, i, a) => a.indexOf(v) == i);
            return keys.reduce((s, v) =>
            {
                s[v] = array.filter(vv => keySelector(vv) == v).map(vv => valueSelector(vv));
                return s
            }, {});
        }
Добавлено через 13 минут
Цитата Сообщение от Yannnaaa Посмотреть сообщение
Но как правильно использовать в функции передаваемые item => item.country, item => item.city ?
Если уж прямо отвечать на этот вопрос, то думаю, надо заменить в коде item.country на keySelector(item), а item.city на valueSelector(item). Но в код я особо не вникал, так что может и ошибся))
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.10.2018, 16:32
Если нужно Map, то вариант с использованием Map и его родных методов:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
        function group(array, keySelector, valueSelector) {
            let map = new Map(),
                count = array.length;
 
            for (let key, i = 0; i < count; ++i) {
                key = keySelector(array[i]);
                if (map.has(key))
                    map.get(key).push(valueSelector(array[i]));
                else
                    map.set(key, [valueSelector(array[i])]);
            }
            return map;
        }
1
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
03.10.2018, 17:05
Ну заодно и свои пять копеек вставлю - https://codepen.io/qwerty_wasd/pen/jeWpYK
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let arrTmp = [
  { country: 'Belarus', city: 'Brest' },
  { country: 'Russia', city: 'Omsk' },
  { country: 'Russia', city: 'Samara' },
  { country: 'Belarus', city: 'Grodno' },
  { country: 'Belarus', city: 'Minsk' },
  { country: 'Poland', city: 'Lodz' }
];
const group = arr => {
  let map = new Map(),
      objTmp = {},
      structTmp = arr.map((e, i) => arr.filter(el => el.country === arr[i].country))
                     .filter(e => objTmp.hasOwnProperty(e) ? false : (objTmp[e] = true)),
      arrTmpCity = structTmp.map(e => e.map(el => el.city));
      arrTmpCountry = structTmp.map(e => e[0].country).forEach((e, i) => map.set(e,arrTmpCity[i]));
  return map;
};
console.log(group(arrTmp));
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
04.10.2018, 10:35
Цитата Сообщение от Yannnaaa Посмотреть сообщение
Но как правильно использовать в функции
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function group(myArray, keySelector, valueSelector) {
  // var group_to_values = myArray.reduce(function (obj, item) {
  return myArray.reduce(function(obj, item) {
    var key = keySelector(item);
    // obj[item.country] = obj[item.country] || [];
    obj[key] = obj[key] || [];
    // obj[item.country].push(item.city);
    obj[key].push(valueSelector(item));
    return obj;
  }, {})
 
  // return Object.keys(group_to_values).map(key => [ key, group_to_values[key]]);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2018, 10:35
Помогаю со студенческими работами здесь

Не получается сгруппировать запущенные процессы по ключу SID
Задача простая - разделить запущенные в системе процессы на системные и запущенные пользователем. Пытаюсь отфильтровать хотя бы...

Сгруппировать одинаковые элементы массива
Здравствуйте, подскажите пожалуйста,например,мы вводим массив 1,2,3,4,5,6,5,1 а вывод был 11,2,3,4,55,6. Как это реализовать ?

Вытащить элементы из массива по ключу
Добрый день! Есть массив $users = array( array('name' =&gt; 'Владимир', 'email' =&gt; 'vlad@saytum.ru', 'age' =&gt; 14,...

Поменять местами элементы массива по ключу
Доброго времени суток! Задача состоит в следующем: дан массив символов, необходимо поменять их местами, заданными ключом-строкой. ...

Вывод значения ключей массива по условию совпадения других ключей
Есть массив $arElements Array ( =&gt; Array ( =&gt; first =&gt; Name =&gt;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru