Фильтрация объекта по значению ключа из массива и вывод объекта с фильтрами и числом

156
28 августа 2018, 23:50

Имеется код:

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 но не вышло или возможно я не правильно использовал.

Answer 1

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

READ ALSO
Api-maps на всех страницах

Api-maps на всех страницах

У меня есть главная страница, на которой рендеряться другие

190
динамическое добавление уникальных options в select

динамическое добавление уникальных options в select

Ситуация следующаяЕсть массив объектов (маркеры для карты)

219
Как в SetInterval передать функцию с параметром

Как в SetInterval передать функцию с параметром

Необходимо в вункцию передать параметр, но втаком виде интервал не работает

307
Почему console.log() влияет на значение переменной?

Почему console.log() влияет на значение переменной?

Для пролистывания задач у меня есть функция изменяющия номер текущей задачи:

202