@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;
      }
  • Вопрос задан
  • 1126 просмотров
Решения вопроса 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 sum = (data, getVal) => Object
  .values(data instanceof Object ? data : {})
  .reduce((acc, n) => acc + sum(n, getVal), getVal(data));


sum([ 1, 2, 3, '1', [ '2', 4, [ '3' ] ], '4' ], x => +(typeof x === 'string')) // 4
sum({ a: { b: [ NaN, Infinity ], c: 123456 } }, x => +(typeof x === 'number')) // 3
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 22:48
100 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект