Имеется код:
const contact = [{
name: 'Petr',
surname: 'Petrov',
hobby: ['biologi', 'football']},
{
name: 'Alexyi',
surname: 'Alexeev',
hobby: ['biologi', 'football', 'cars']
},
{
name: 'Spiridon',
surname: 'spiridonov',
hobby: ['cars', 'math',"cats"]
},
{
name: 'Ivan',
surname: 'Ivanushkin',
hobby: ['biologi', 'football', 'math']
}];
С него нужно получить объект по значениям и количеству совпадений:
{
biologi:3,
football:3,
cats:1,
math:2,
cars:1
}
Не знаю с какой стороны подойти к hobby т.к это массив. Думал через arr.filter но не вышло или возможно я не правильно использовал.
MapReduce:
const contacts = [{
name: 'Petr',
surname: 'Petrov',
hobby: ['biologi', 'football']
},
{
name: 'Alexyi',
surname: 'Alexeev',
hobby: ['biologi', 'football', 'cars']
},
{
name: 'Spiridon',
surname: 'spiridonov',
hobby: ['cars', 'math', "cats"]
},
{
name: 'Ivan',
surname: 'Ivanushkin',
hobby: ['biologi', 'football', 'math']
}
];
let res = contacts
.map(c => c.hobby) // Для начала отобразим интересующие нас данные -> [['cat', 'car'], ['car']]
.reduce((c, hb) => (hb.forEach(h => c[h] ? c[h]++ : c[h] = 1), c), {}) // считаем, сколько чего, проходя по каждому массиву forEach
let res2 = contacts
.map(a => a.hobby) // Для начала отобразим интересующие нас данные -> [['cat', 'car'], ['car']]
.reduce((c, l) => c.concat(l), []) // Теперь соберём всё в один масив -> ['cat', 'car', 'car']
.reduce((c, h) => (c[h] = c[h] ? c[h] + 1 : 1, c), {}) // считаем, сколько чего
console.log(res, res2);
Array.prototype.map
Array.prototype.reduce
Arrow functions
Сборка персонального компьютера от Artline: умный выбор для современных пользователей