Преобразование ключей и значений объекта в другой объект

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

Например, учитывая этот входной объект:

{
    person: {
        first_name: "fn",
        last_name: "ln",
        address: {
            city: "c",
            street: "s",
        },
        movies: [
            {
                title: "movie1"
            },
            {
                title: "movie2"
            }
        ]
    }
}

результат должен быть:

{
    name: "person",
    children: [
        {
            name: "first_name"
        },
        {
            name: "last_name"
        },
        {
            name: "address",
            children: [
                {
                    name: "city"                  
                },
                {
                    name: "street"                  
                }
            ]
        },
        {
            name: "movies",
            children: [
                {
                    name: "title"
                }
            ]
        }
    ]
}

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

Можете ли вы показать свою попытку, пожалуйста?

Jack Bashford 30.05.2019 15:03

Да, как только я доберусь до рабочей станции

Rus Paul 30.05.2019 15:03

Что делать, если есть еще один ключ с person?

Maheer Ali 30.05.2019 15:06

Не будет. Но если это так, он должен переопределить первый

Rus Paul 30.05.2019 15:06

@Fraction не будет, данные уже очищены и правильно отформатированы. Входная структура не меняется

Rus Paul 30.05.2019 16:26
Поведение ключевого слова "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) для оценки ваших знаний,...
1
5
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете сделать это, используя рекурсию. Создайте функцию, которая принимает запись в качестве входных данных. Entry — это массив из двух элементов, который содержит пару ключ-значение для объекта. [key,value]

const obj = { person: { first_name: "fn", last_name: "ln", address: { city: "c", street: "s", }, movies: [ { title: "movie1" }, { title: "movie2" } ] } }

function getKeys(entry){
  let obj = {
    name:entry[0],
    children:[]
  }
  const { children } = obj
  let val = entry[1]
  for(let k in val){
    if (Array.isArray(val[k])){
      children.push(getKeys([k,val[k][1]]));
    }
    else if (typeof val[k] === "object"){
      children.push(getKeys([k,val[k]]))
    }
    else children.push({name:k})
  }
  if (!obj.children.length) delete obj.children;
  return obj
}
console.info(getKeys(Object.entries(obj)[0]))

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