@KirillEX

Почему не работает рекурсивный вызов?

let a = {
	name: "Marshall",
	age: 47,
	child: {
		name: "Haley",
		age: 24
	}
};

function deepEqual(obj) {
	let sort = Object.entries(obj);
	sort = sort.sort()
	obj = Object.fromEntries(sort);
	for (let key in obj) {
		if (typeof key === "object") {
			deepEqual(key)
		}
	};
	return obj;
};
console.log(deepEqual(a))

Почему не работает рекурсивная сортировка? Сам объект сортируется, а его свойство объект нет.
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
@andreysuha
Что то знаю
if (typeof key === "object") {
      deepEqual(key)
    }


Замените на

if (typeof obj[key] === "object") {
      deepEqual(obj[key])
    }


https://developer.mozilla.org/uk/docs/Web/JavaScri...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Классический "затык" в рекурсии.

Функция deepEqual возвращает отсортированный объект.
А здесь куда девается возвращаемое значение (вложенный объект)?
if (typeof key === "object") {
      deepEqual(key)
    }


Никуда. Он сортируется в следующих уровнях рекурсии, но назад не возвращается.

Полагаю, должно быть так:

if (typeof key === "object") {
      obj[key] = deepEqual(key)
    }


UPD
И вообще, for..in перебирает ключи объекта, а не их значения!
Навскидку:
obj = Object.fromEntries(sort);
for (let key in obj) {
  if (!obj.hasOwnProperty(key)) continue;
  let subObj = obj[key];
  if (typeof subObj === "object") {
    obj[key] = deepEqual(subObj)
  }
};
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы