Как бы вы реализовали функцию отображения от ключей объекта к другому объекту, у которого есть свойство с этим конкретным ключом, сохраняя структуру объекта
Например, учитывая этот входной объект:
{
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"
}
]
}
]
}
Я пробовал использовать некоторые рекурсивные обходы объектов, но реализация была действительно уродливой. Я чувствую, что есть более простой способ справиться с этим
Да, как только я доберусь до рабочей станции
Что делать, если есть еще один ключ с person
?
Не будет. Но если это так, он должен переопределить первый
@Fraction не будет, данные уже очищены и правильно отформатированы. Входная структура не меняется
Вы можете сделать это, используя рекурсию. Создайте функцию, которая принимает запись в качестве входных данных. 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]))
Можете ли вы показать свою попытку, пожалуйста?