Привет всем, у меня есть следующий код
данные, которые я хочу преобразовать.
const obj = {
numbers: {
label: "main numbers",
pageTitle: "Numbers",
key: "1",
items: {
firstNumber: {
label: "first number",
pageTitle: "first",
key: "first"
},
secondNumber: {
label: "second number",
pageTitle: "second",
key: "second"
}
}
},
letters: {
label: "main Letters",
pageTitle: "Letters",
key: "2",
items: {
firstLetter: {
label: "first Letter",
pageTitle: "first",
key: "first"
}
}
},
signs: {
label: "main sign",
pageTitle: "Sign",
key: "3"
}
};
В моей переменной obj
у меня есть 3 других объекта
numbers
объект, который имеет items
свойство, которое включает в себя 2 других объекта.
letters
объект, который имеет items
свойство, включающее только один объект.
signs
объект.
Мне нужно преобразовать мой obj
следующим образом.
[
{
label:"main numbers",
pageTitle:"Numbers",
key:1,
children: [{label,pageTitle,key},{label,pageTitle,key}]
},
{
label:"main Letters",
pageTitle:"Letters",
key:1,
children: [{label,pageTitle,key}]
},
{
label:"main sign",
pageTitle:"Sign",
key:1,
children: []
},
]
для этого преобразования я написал следующий код.
const transformedData = Object.values(obj).map((menuitem) => menuitem);
const data = [];
transformedData?.map((x) => {
const newData = {};
newData.label = x.label;
newData.pageTitle = x.pageTitle;
newData.key = x.key;
newData.children = x?.Object?.values(items)?.map((el) => {
newData.children.label = el.label;
newData.children.pageTitle = el.pageTitle;
newData.children.key = el.key;
});
data.push(newData);
});
Все работало, но для children
вместо вывода массива печатается undefined
.
Пожалуйста, помогите мне решить эту проблему.
x
не имеет Objects
. Измените его на:
newData.children = Object.values(x.items)?.map(/*...*/);
Вы можете показать это в фрагменте кода, пожалуйста? :)
Это то, что вам нужно?
const transformedData = Object.values(obj).map((menuitem) => menuitem);
const data = [];
transformedData?.map((x) => {
const newData = {};
newData.label = x.label;
newData.pageTitle = x.pageTitle;
newData.key = x.key;
if (x.hasOwnProperty('items')){
newData.children = Object.values(x.items).map((el) => {
const obj = {
label:el.label,
pageTitle:el.pageTitle,
key:el.key
}
return obj
})};
data.push(newData);
});
console.info(data)
Ваш код возвращает undefined
, потому что внутри карты вы ничего не возвращали, поэтому newData.children
никогда ничем не заполнялся.
Кроме того, я думаю, что доступ и назначение newData.children.label
было проблематичным, поскольку newData.children
еще не было. Итак, мы объявляем временную obj
внутри карты и возвращаем ее
Наконец, нам нужно проверить, является ли items
свойством, которое существует изначально.
Я создал функцию для вашего случая.
const convert = data =>
Object.values(data)?.map(x => ({
label: x.label,
pageTitle :x.pageTitle ,
key: x.pathname,
children: x.items
? Object.values(x.items || {}).map(el => ({ label: el.label,
key:el.pathname,pageTitle:el.pageTitle }))
: null,
}));
Вы можете использовать как const items = convert(obj)
.
Object.values
всегда возвращает массив.