Реагировать рекурсивно итерировать через вложенные объекты

я пытаюсь рекурсивно перебирать вложенные объекты, чтобы получить ключ и значение.

Моя структура данных:

  {         
    "id": 8743077530231325861,
    "name": "Name of XYZ",
    "key X": 0,
    "key Y": {
      "details": {
        "value": {
          "up": 5,
          "down": 3
        },
        "path": "xyz"
      },
      "key Z": {
        "value": 1,
        "path": "abc"
      }
    },
    "createdTimestamp": 1554446703000
  }

и моя функция:

  recursion = (item, keyString) => {
    if (isObject(item)){
      Object.keys(item).map((key) => {
        return this.recursion(item[key], keyString+`.${key}`)
      })
    }else{
      return {item, keyString}
    }
  }

и я называю это:

Object.keys(data).map(key =>{
   console.info(this.recursion(data[key], key))
})

Моя проблема в том, что ключи, которые являются объектами, всегда не определены. Я знаю, что это потому, что им нужно повторить итерацию в другой раз, и результат будет быстрее, чем функция. Когда я распечатываю значения в конце функции рекурсии вместо того, чтобы возвращать их, они не являются неопределенными.

В конце я хочу для каждого ключа все самые глубокие значения и «пути». Например

8743077530231325861,"id"
Name of XYZ,"name"
0, "keyX"
5, "keyY.details.value.up"
...

Я уже пытался использовать await/async, но не могу получить все значения

было бы неплохо, если бы кто-нибудь подсказал мне

Каков ожидаемый результат?

Maheer Ali 09.04.2019 15:27

Вы ничего не возвращаете в if (isObject(item)){ ... }. Обновите Object.keys(item).map до return Object.keys(item).map и все должно работать

Rajesh 09.04.2019 15:31

@MaheerAli Я хочу получить самый глубокий вложенный элемент и путь. Первый вывод = 8743077530231326000, второй: имя XYZ, имя, третий: 5, key.details.value.up

Stevetro 09.04.2019 17:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
711
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно вернуть результат сопоставления.

const
    isObject = v => v && typeof v === 'object',
    recursion = (item, path = '') => isObject(item)
        ? Object
            .keys(item)
            .flatMap(k => recursion(item[k], path + (path && '.') + k))
        : { item, path };

var data = { id: 8743077530231326000, name: "Name of XYZ", "key X": 0, "key Y": { details: { value: { up: 5, down: 3 }, path: "xyz" }, "key Z": { value: 1, path: "abc" } }, createdTimestamp: 1554446703000 },
    result = recursion(data);

console.info(result);

но таким образом он возвращает объект как массивы. Я хочу снова вызвать рекурсию для каждого ключа в объекте, чтобы просто распечатать самую глубокую пару элемент + ключ. Например: 5, keyY.details.value.up, 3, keyY.details.value.down и т. д.

Stevetro 09.04.2019 17:00

пожалуйста, добавьте желаемый результат к вопросу. Кстати, в вопросе не говорится, что нужен самый глубокий объект. а если их больше одного?

Nina Scholz 09.04.2019 17:04

я добавил желаемый результат

Stevetro 09.04.2019 17:05

Другие вопросы по теме