Как посчитать количество фруктов

Нужно вывести сколько раз строка повторяется в массиве, но обращаться напрямую к объекту нельзя. Вот что получилось у меня, сам массив я проверить могу но вывести как показано ниже не получается

const obj = {
    viktor: ['apple', 'grape', 'orange', 'apple', 'banana'],
    kate: ['grape', 'orange', 'apple', 'grape', 'banana'],
};


function calc() {
    //Запрещено обращаться на прямую к obj.viktor или object.kate
    //клонируем обьект
    let cloneObj = Object.assign({}, obj);
    //получаем значения массивов
    const countArray = (obj) => Object.values(obj).reduce((currentValue, index) => ({ ...currentValue,         [index]: (currentValue[index] || 0) + 1}), {});
    //получаем значение ключей
        const countKeys = (obj) => Object.keys(obj).reduce((currentValue, index, array) => ({ ...currentValue,     [index]: ({})}), {});
        console.log(countKeys(obj));
        console.log(countArray(cloneObj.viktor));
}

calc();

Вот в таком виде должно выводится в консоль при вызове calc
// Вот такой должен быть результат
// {
//     viktor: {
//         apple: 2,
//         grape: 1,
//         orange: 1,
//         banana: 1,
//     },
//     kate: {
//         apple: 1,
//         grape: 2,
//         orange: 1,
//         banana: 1,
//     },
// }


Ответы (1 шт):

Автор решения: Grundy

Достаточно в качестве значения для ключа передавать не пустой объект

[index]: ({})

а результат вызова countArray

Например так:

const obj = {
  viktor: ['apple', 'grape', 'orange', 'apple', 'banana'],
  kate: ['grape', 'orange', 'apple', 'grape', 'banana'],
};


function calc(data) {
  //получаем значения массивов
  const countArray = (arr) => arr.reduce((acc, val) => ({ ...acc,
    [val]: (acc[val] || 0) + 1
  }), {});
  //получаем значение ключей
  const countKeys = (o) => Object.keys(o).reduce((acc, key) => ({ ...acc,
    [key]: countArray(o[key])
  }), {});
  return countKeys(data);
}

console.log(calc(obj));

→ Ссылка