Показать сообщение отдельно
  #1 (permalink)  
Старый 24.10.2023, 19:59
Аспирант
Отправить личное сообщение для firep91613 Посмотреть профиль Найти все сообщения от firep91613
 
Регистрация: 24.10.2023
Сообщений: 45

Scope функции
Подскажите, пожалуйста. Сейчас функция работает как надо. Но если у функции worker убрать аргумент, то вылетает ошибка - глубина стека превышена. Почему так происходит? Вроде же функция запоминает свое окружение и может дотянуться до аргумента первой функции (collapse).

const data = {
  a: {
    b: [1, 2],
    c: {
      d: 3,
      f: {
        j: [20, 30]
      }
    }
  },
  h: 4
};

function checkType(value) {
  const type = Object.prototype.toString.call(value);
  return type.substring(8, type.length - 1);
}

function collapse(obj) {
  const result = {};
  let temp = '';

  function worker(obj) {
    for (let prop in obj) {
      if (checkType(obj[prop]) == 'Object') {
        temp += prop + '.';
        worker(obj[prop]);
        temp = '';
      } else if (checkType(obj[prop]) == 'Array') {
        for (var i = 0; i < obj[prop].length; i++) {
          let s = temp;
          s += prop + '.' + [i];
          result[s] = obj[prop][i];
          s = '';
        }
      } else {
        result[temp + prop] = obj[prop];
      }
    }
  }
  
  worker(obj);

  return result;
}

console.log(collapse(data));
Ответить с цитированием