помогите решить задачу с использованием РЕКУРСИИ

Реализуйте (с использованием рекурсии) функцию getStringCount, которая должна принимать массив или объект и считать количество строк в массиве / значениях объекта с учетом вложенности.

function getStringCount(object) {
  //code here
}

getStringCount
({
  first: '1',
  second: '2',
  third: false,
  fourth: ['anytime', 2, 3, 4 ],
  fifth:  null,
}); // 3

getStringCount
(['1', '2', ['3']]) // 3

решил без рекурсии

let arr = {
  first: "1",
  second: "2",
  third: false,
  fourth: ["anytime", 2, 3, 4],
  fifth: null,
};
let arr2 = ["1", "2", ["3"]];

function getStringCount(object) {
  let res = Object.values(object).flat();
  res = res.filter(function (item) {
    return typeof item === "string";
  });
  console.log(res.length);
}

getStringCount(arr);
getStringCount(arr2);

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

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

function getStringCount(object, acc = { result: 0 }) {
  // Получаем все значения из объекта
  const values = Object.values(object);
  for (let i = 0; i < values.length; i += 1) {
    // Если элемент строка прибавляем в результат 1
    if (typeof values[i] === 'string') {
        acc.result += 1;
    // Если элемент объект и не null
    } else if (typeof values[i] === 'object' && values[i] !== null) {
       // Рекурсивно вызываем функцию передавая туда объект который нашли и аккумулятор где содержится счетчик
       getStringCount(values[i], acc);
    }
  }
  return acc.result;
}

→ Ссылка
Автор решения: Grundy

Задачу можно разделить на несколько шагов:

  1. если объект строка - возвращаем 1.
  2. если объект имеет falsy значение - возвращаем 0
  3. берем все свойства объекта и для каждого из них считаем количество строк, результат суммируем

Например:

function getStringCount(object) {
  if (typeof object == 'string') return 1;

  if (!object) return 0;

  return Object.values(object).reduce((acc, cur) => acc + getStringCount(cur), 0);
}

console.log(getStringCount({
  first: '1',
  second: '',
  third: false,
  fourth: ['anytime', 2, 3, 4],
  fifth: null,
})); // 3

console.log(getStringCount(['1', '2', ['3']])); // 3

→ Ссылка