Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Ewelai
5 / 5 / 0
Регистрация: 13.12.2018
Сообщений: 18
1

Группировка массива по возрасту, имени или фамилии

30.12.2018, 12:57. Просмотров 1456. Ответов 16
Метки нет (Все метки)

Нужно написать функцию, которая будет группировать массив по возрасту, имени или фамилии. Функция должна возвращать ассоциативный массив с ключами – группами, а значения-массивами с лицами в этих группах. Нужно так же использовать функцию перегрузки(только 1 функцию).

Javascript
1
2
3
4
   var persons = { ... };
   var groupedByAge = groupPeople (persons, "age");
   var groupedByLastName = groupPeople(persons, "lastname");
   var groupedByFirstName = groupPeople (persons, "firstname");
Javascript
1
2
3
4
5
6
7
8
9
var persons = [
                        { firstname: "Lopi", lastname: "Osipenko", age: 53 },
                        { firstname: "Kristina", lastname: "Osipenko", age:20 },
                        { firstname: "Artem", lastname: "Korhov", age: 16},
                        { firstname: "Artem", lastname: "Seredinskiy", age: 25},
                        { firstname: "Artem", lastname: "Artsiomenka", age: 30},
                        { firstname: "Sergey", lastname: "Osipenko", age: 15},
                        { firstname: "Sergey", lastname: "Korhov", age: 18 }
            ];
1
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2018, 12:57
Ответы с готовыми решениями:

Определение пола по фамилии или имени
Есть два столбца с именами и фамилиями. Нужно определить пол -мужской или женский.. Вопрос, как...

Поиск по имени или фамилии в БД [есть ответ]
Несколько часов потратил на такой момент: Имеется база Access отображаемая через DBGrid. При...

Вывод фамилии, имени и отчества с помощью функции с явно заданными или частично пропущенными параметрами
1 Написать функцию с параметрами по умолчанию в соответствии с вариантом , продемонстрировать...

Сортировщик по имени и возрасту
Добрый день! Мне необходимо написать программу, которая выводит таблицу 2-х размерного массива,...

Составьте программу получения из вашей фамилии(имени или отчества) любых трех слов. Воспользуйтесь операцией«сцепление» (+) и функцией«к
Составьте программу получения из вашей фамилии(имени или отчества) любых трех слов. ...

16
amr-now
Эксперт JS
1934 / 1137 / 540
Регистрация: 14.06.2018
Сообщений: 2,784
30.12.2018, 14:59 2
Лучший ответ Сообщение было отмечено diadiavova как решение

Решение

Здравствуйте!
PHP/HTML
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
<!doctype html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <script>
        /**
         * Группировка массива без сортировки по ключу. Сортировать при необходимости отдельно.
         * Практика JS - числовые свойства упорядочены как числовые индексы. Строковые свойства неупорядочены.
         * @param {Array} array Входящий массив.
         * @param {String} property Имя свойства у элемента массива, по которому группировать.
         * @returns {Object} Ассоциативный массив с ключами – группами, а значения-массивами
         */
        function groupPeople(array, property) {
            let result = {};
            for (let e of array)
                if (result[e[property]])
                    result[e[property]].push(e);
                else
                    result[e[property]] = [e];
            return result;
        }
        let persons = [
            { firstname: "Lopi", lastname: "Osipenko", age: 53 },
            { firstname: "Kristina", lastname: "Osipenko", age: 20 },
            { firstname: "Artem", lastname: "Korhov", age: 16 },
            { firstname: "Artem", lastname: "Seredinskiy", age: 25 },
            { firstname: "Artem", lastname: "Artsiomenka", age: 30 },
            { firstname: "Sergey", lastname: "Osipenko", age: 15 },
            { firstname: "Sergey", lastname: "Korhov", age: 18 }
        ];
        let groupedByAge = groupPeople(persons, "age"),
            groupedByLastName = groupPeople(persons, "lastname"),
            groupedByFirstName = groupPeople(persons, "firstname");
        console.log(groupedByAge);
        console.log(groupedByLastName);
        console.log(groupedByFirstName);
    </script>
</body>
</html>
2
Ewelai
5 / 5 / 0
Регистрация: 13.12.2018
Сообщений: 18
30.12.2018, 15:16  [ТС] 3
Выводит Object Object

Добавлено через 49 секунд
Я уже решила, так что если есть мысли по тому, как можно улучшить - пишите)

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
let persons = [
    { firstname: "Natalya", lastname: "Osipenko", age: 61 },
    { firstname: "Kristina", lastname: "Osipenko", age:23 },
    { firstname: "Artem", lastname: "Korhov", age: 25 },
    { firstname: "Artem", lastname: "Seredinskiy", age: 20 },
    { firstname: "Artem", lastname: "Artsiomenka", age: 20 },
    { firstname: "Sergey", lastname: "Osipenko", age: 20 },
    { firstname: "Vinni", lastname: "Puh", age: 15 }
  ];
 
  let firstName = [], lastName = [], agePerson = [];
 
  for(let i = 0; i < persons.length - 1; i++) {
    firstName.push(persons[i].firstname);
    lastName.push(persons[i].lastname);
    agePerson.push(persons[i].age);
  }
 
  function groupOfPeople(person, property) {
    if(property == 'firstname') {
      let unique = function(firstName) {
        let value = {};
        return firstName.filter((item) => {
          return item in value ? false : value[item] = true;
        });
      }
      console.log(unique(firstName));
    }
 
    if(property == 'lastname') {
      let unique = function(lastName) {
        let value = {};
        return lastName.filter((item) => {
          return item in value ? false : value[item] = true;
        });
      }
      console.log(unique(lastName));
    }
 
    if(property == 'age') {
      let unique = function(agePerson) {
        let value = {};
        return agePerson.filter((item) => {
          return item in value ? false : value[item] = true;
        });
      }
      console.log(unique(agePerson));
    }
  }
 
  groupOfPeople(persons, 'firstname');
  groupOfPeople(persons, 'lastname');
  groupOfPeople(persons, 'age');
0
amr-now
Эксперт JS
1934 / 1137 / 540
Регистрация: 14.06.2018
Сообщений: 2,784
30.12.2018, 15:22 4
Ewelai, какой у вас браузер и какой версии?

Добавлено через 2 минуты
И в MS Edge и в свежей Опере всё работает:
HTML1300: Произошел переход.
JavaScript2382432.htm (1,1)
[object Object]: {15: Array, 16: Array, 18: Array, 20: Array, 25: Array...}
[object Object]: {Artsiomenka: Array, Korhov: Array, Osipenko: Array, Seredinskiy: Array}
[object Object]: {Artem: Array, Kristina: Array, Lopi: Array, Sergey: Array}
0
30.12.2018, 15:22
Ewelai
5 / 5 / 0
Регистрация: 13.12.2018
Сообщений: 18
30.12.2018, 15:24  [ТС] 5
Chrome, последняя версия
0
amr-now
Эксперт JS
1934 / 1137 / 540
Регистрация: 14.06.2018
Сообщений: 2,784
30.12.2018, 15:25 6
Цитата Сообщение от Ewelai Посмотреть сообщение
let unique = function(agePerson) {
Javascript
1
2
3
4
5
6
 let value = {};
return agePerson.filter((item) => {
return item in value ? false : value[item] = true;
});
}
console.log(unique(agePerson));
Кстати, возвращать из функции функцию - очень плохая практика, создающая иллюзию, что человек умеет программировать.
Обычно возвращает функцию как раз неопытный программист.
0
Ewelai
5 / 5 / 0
Регистрация: 13.12.2018
Сообщений: 18
30.12.2018, 15:31  [ТС] 7
Как можно исправить?
0
klopp
406 / 346 / 154
Регистрация: 14.10.2017
Сообщений: 937
30.12.2018, 21:32 8
amr-now, имхо, вы забыли тело цикла в фигурные скобки заключить
Цитата Сообщение от Ewelai Посмотреть сообщение
как можно улучшить
повторяемость кода, строки 20-28, 30-38 и 40-48 повторяют друг друга. Как раз для таких случаев и были придуманы функции
и в целом,логика кода какая-то...не логичная, у вас же задача практически решена в строках 11-17, осталось полученные массивы объединить в
Цитата Сообщение от Ewelai Посмотреть сообщение
ассоциативный массив с ключами – группами, а значения-массивами с лицами в этих группах
можно так доделать ваш код(хотя это и корявенько):
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
function groupOfPeople(arr) {
  let firstName = [], lastName = [], agePerson = [], res = {};
  for(let i = 0; i < persons.length - 1; i++) {
    firstName.push(persons[i].firstname);
    lastName.push(persons[i].lastname);
    agePerson.push(persons[i].age);
  }
    res.firstname = firstName;
    res.lastname = lastName;
    res.age = agePerson;
    return res;
}
console.log(groupOfPeople(persons));
я бы сделал так:
Javascript
1
2
3
const groupedBy = (arr, prop) => ({prop : arr.map(el => el[prop])});
for(let key in persons[0])
    console.log(groupedBy(persons, key));
0
amr-now
Эксперт JS
1934 / 1137 / 540
Регистрация: 14.06.2018
Сообщений: 2,784
30.12.2018, 22:54 9
Цитата Сообщение от klopp Посмотреть сообщение
имхо, вы забыли тело цикла в фигурные скобки заключить
Формально в стандарте языка скобки не нужны.
А действительно мой код в Хроме не работает? В MS Edge и Opera(Blink) работает и даже никаких предупреждений не выводит.
0
klopp
406 / 346 / 154
Регистрация: 14.10.2017
Сообщений: 937
31.12.2018, 05:11 10
Цитата Сообщение от amr-now Посмотреть сообщение
А действительно мой код в Хроме не работает?
в консоли такое выводит:
Код
{15: Array(1), 16: Array(1), 18: Array(1), 20: Array(1), 25: Array(1), 30: Array(1), 53: Array(1)}
15: [{…}]
16: [{…}]
18: [{…}]
20: [{…}]
25: [{…}]
30: [{…}]
53: [{…}]
__proto__: Object
scripts.js:102 
{Osipenko: Array(3), Korhov: Array(2), Seredinskiy: Array(1), Artsiomenka: Array(1)}
Artsiomenka: [{…}]
Korhov: (2) [{…}, {…}]
Osipenko: (3) [{…}, {…}, {…}]
Seredinskiy: [{…}]
__proto__: Object
scripts.js:103 
{Lopi: Array(1), Kristina: Array(1), Artem: Array(3), Sergey: Array(2)}
Artem: (3) [{…}, {…}, {…}]
Kristina: [{…}]
Lopi: [{…}]
Sergey: (2) [{…}, {…}]
__proto__: Object
1
diadiavova
4085 / 1474 / 451
Регистрация: 11.04.2015
Сообщений: 2,708
Записей в блоге: 35
31.12.2018, 05:15 11
Цитата Сообщение от klopp Посмотреть сообщение
в консоли такое выводит:
А как еще следует понимать следующую фразу?
Цитата Сообщение от Ewelai Посмотреть сообщение
Функция должна возвращать ассоциативный массив с ключами – группами, а значения-массивами с лицами в этих группах.
1
klopp
406 / 346 / 154
Регистрация: 14.10.2017
Сообщений: 937
31.12.2018, 05:44 12
Цитата Сообщение от diadiavova Посмотреть сообщение
А как еще следует понимать следующую фразу
как я понял задание,ответ должен быть такого вида:
Код
[
{firstname: (7) ["Lopi", "Kristina", "Artem", "Artem", "Artem", "Sergey", "Sergey"]},
{lastname: (7)*["Osipenko", "Osipenko", "Korhov", "Seredinskiy", "Artsiomenka", "Osipenko", "Korhov"},
{age: (7) [53, 20, 16, 25, 30, 15, 18]}
]
Ewelai, мою функцию чуть-чуть переделал:
Javascript
1
2
3
4
5
6
7
8
const groupPeople = arr => {
    const groupedBy = (a, prop) => ({[prop] : a.map(el => el[prop])});
    let res = [];
    for(let key in arr[0])
        res.push(groupedBy(arr, key));
    return res;
}
console.log(groupPeople(persons));
0
diadiavova
4085 / 1474 / 451
Регистрация: 11.04.2015
Сообщений: 2,708
Записей в блоге: 35
31.12.2018, 05:53 13
Цитата Сообщение от klopp Посмотреть сообщение
как я понял задание,ответ должен быть такого вида:
Почему это тогда называется группировкой?
Цитата Сообщение от Ewelai Посмотреть сообщение
Нужно написать функцию, которая будет группировать массив по возрасту, имени или фамилии.
Взять, например, по фамилии. Неужели вот это {lastname: (7)*["Osipenko", "Osipenko", "Korhov", "Seredinskiy", "Artsiomenka", "Osipenko", "Korhov"} можно считать группировкой первоначального массива по фамилии? Это просто список фамилий и не более того. Группировка подразумевает разбивку на группы, в каждой группе будут только те объекты, у который фамилии одинаковые и фамилия в данном случае как раз будет ключом группировки. И amr-now сделал именно это, причем наиболее оптимальным способом. Не знаю, конечно, возможно ТС скажет иначе, но первоначальная формулировка задачи, на мой взгляд, описывает проблему исчерпывающе.
1
klopp
406 / 346 / 154
Регистрация: 14.10.2017
Сообщений: 937
31.12.2018, 05:56 14
ну значит я неправильно понял тз

Не по теме:

diadiavova, С наступающим!Всех благ и здоровья!

0
diadiavova
31.12.2018, 06:05
  #15

Не по теме:

Цитата Сообщение от klopp Посмотреть сообщение
diadiavova, С наступающим!Всех благ и здоровья!
Тебя тоже с праздником и всего наилучшего.

0
Ewelai
5 / 5 / 0
Регистрация: 13.12.2018
Сообщений: 18
31.12.2018, 10:21  [ТС] 16
Ребятки, всем спасибо! С наступающим!
1
j2FunOnly
06.01.2019, 20:43     Группировка массива по возрасту, имени или фамилии
  #17

Не по теме:

Цитата Сообщение от amr-now Посмотреть сообщение
Кстати, возвращать из функции функцию - очень плохая практика
Простите что? А как же функции высшего порядка (high order function), function currying?

0
06.01.2019, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2019, 20:43
Привет! Вот еще темы с ответами:

Не получается группировка по имени
Не получается сгруппировать по имени SELECT Products.ID, Products.Name, SUM(Products.Price *...

Сортировка по фамилии и имени в С++
Добрый день, подскажите пожалуйста как реализовать. Задание следующие, у нас есть файл с фамилиями...

Сортировка по имени и фамилии
Всем знатокам доброго времени суток! Как в этом коде - Dim airports As New Hashtable ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru