@Atheist21

Как задавать переменные при рекурсии?

Есть массив или объект различной вложенности, задача чтобы в нем посчитать все имеющиеся строчные элементы. Я её решил, если задавать счетчик строк как глобальную переменную.
let countString = 0;
      function getStringCount(object) {
        for (let i in object) {
          if (typeof object[i] === "object") {
            getStringCount(object[i]);
          } else {
            if (typeof object[i] === "string") {
              countString++;
            }
          }
        }
        return countString;
      }

      console.log(getStringCount([1, 2, 3, "1", ["1", 1, ["f", 1]]]));


Но так получается слишком коряво, хочу чтобы переменная задавалась внутри функции. Пытаюсь использовать возможности ES6, переменная при каждом следующем вызове функции себя самой - обновляется. Что я делаю не так? На что обращать внимание? Как правильно при рекурсии задать переменные чтобы она не обновлялась?
function getStringCount(object, countString) {
        countString = countString || 0;
        for (let i in object) {
          if (typeof object[i] === "object") {
            getStringCount(object[i], countString);
          } else {
            if (typeof object[i] === "string") {
              countString++;
            }
          }
        }
        return countString;
      }

Рассчитываю на помощь!
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 2
Sqvall
@Sqvall
Python, JavaScript fullstack developer.
Создай внутри этой функции ещё одну, которая будет вызывать этот цикл, примерно так.
function getStringCount(obj) { 
  let countString = 0;
  function foo(object) {
    for (let i in object) { 
      if (typeof object[i] === "object") { 
        foo(object[i]);
      } else { 
        if (typeof object[i] === "string") { 
          countString++;
        } 
      } 
    } 
  }
  foo(obj)
  
  return countString; 
}

console.log(getStringCount([1, 2, 3, "1", ["1", 1, ["f", 1]]]))
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
const countRecursive = (obj, test) =>
  Object
    .values(obj instanceof Object ? obj : {})
    .reduce((acc, n) => acc + countRecursive(n, test), +test(obj));


countRecursive([ 1, 2, 3, '1', [ '2', 4, [ '3' ] ], '4' ], x => typeof x === 'string') // 4
countRecursive({ a: { b: { c: [ NaN, Infinity, -0 ] } } }, x => typeof x === 'number') // 3
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 сент. 2020, в 21:23
2500 руб./за проект
18 сент. 2020, в 20:16
13000 руб./за проект
18 сент. 2020, в 19:05
25000 руб./за проект