将对象数组格式化为不同的对象数组标准格式:Javascript



我有一个像这样的对象数组

const input = [
{
group: {
id: "group1",
groupName: "Group1"
},
categories: [
{
id: "category11",
categoryName: "Category 11",
subCategories: []
}
]
},
{
group: {
id: "group2",
groupName: "Group 2"
},
categories: [
{
id: "category21",
categoryName: "Category 21",
subCategories: []
},
{
id: "category22",
categoryName: "Category 22",
subCategories: [
{
id: "category221",
categoryName: "Category 221",
subCategories: []
}
]
}
]
}
];

我想把这个数组转换成下面的对象数组,以包含key, name and categories的对象作为其标准格式,以保持一致性。

const output = [
{
key: "group1",
name: "Group1",
categories: [
{
key: "category11",
name: "Category 11",
categories: []
}
]
},
{
key: "group2",
name: "Group 2",
categories: [
{
key: "category21",
name: "Category 21",
categories: []
},
{
key: "category22",
name: "Category 22",
categories: [
{
key: "category221",
name: "Category 221",
categories: []
}
]
}
]
}
];

input中每个对象的第一层应该被认为是最终输出的根,其余的项应该递归地嵌套在第一层中。

我试过的代码

const output = arr.map((item) => {
return {
key: item.group.id,
name: item.group.groupName,
categories: [{ ...item }]
};
});

我能够格式化第一个级别,但不能格式化整个输出。有人能帮我一下吗?

您可以采用递归方法进行一些重命名。

const
format = ({ id, categoryName, categories, subCategories, group: { id: key, groupName: name } = { id, groupName: categoryName } }) => ({
key,
name,
categories: (categories || subCategories).map(format)
}),
input = [{ group: { id: "group1", groupName: "Group1" }, categories: [{ id: "category11", categoryName: "Category 11", subCategories: [] }] }, { group: { id: "group2", groupName: "Group 2" }, categories: [ { id: "category21", categoryName: "Category 21", subCategories: [] }, { id: "category22", categoryName: "Category 22", subCategories: [{ id: "category221", categoryName: "Category 221", subCategories: [] }] }] }],
result = input.map(format);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

你可以使用递归

function formatItem(item) {
let categories = []
if (item.categories?.length > 0) {
for (category of item.categories) {
categories.push(formatItem(category))
}
}
if (item.subCategories?.length > 0) {
for (category of item.subCategories) {
categories.push(formatItem(category))
}
}
return {
key: item.group?.id ?? item.id,
name: item.group?.groupName ?? item.categoryName,
categories: categories
};
}
const output = arr.map(formatItem);

简单递归函数:

function refactor(object) {
if (Object.hasOwn(object, 'group')) {
// Is a group
return {
key: object.group.id,
name: object.group.groupName,
// Refactor all categories
categories: object.categories.map(refactor)
};
}
// Is a category
return {
key: object.id,
name: object.categoryName,
// Refactor all subcategories
categories: object.subCategories.map(refactor)
};
}
console.log(input.map(refactor))

试一试:

function refactor(object) {
if (Object.hasOwn(object, 'group')) {
// Is not a category
return {
key: object.group.id,
name: object.group.groupName,
categories: object.categories.map(refactor)
};
}
// Is a category
return {
key: object.id,
name: object.categoryName,
categories: object.subCategories.map(refactor)
};
}
const input = [{
group: {
id: 'group1',
groupName: 'Group1'
},
categories: [{
id: 'category11',
categoryName: 'Category 11',
subCategories: []
}]
},
{
group: {
id: 'group2',
groupName: 'Group 2'
},
categories: [{
id: 'category21',
categoryName: 'Category 21',
subCategories: []
},
{
id: 'category22',
categoryName: 'Category 22',
subCategories: [{
id: 'category221',
categoryName: 'Category 221',
subCategories: []
}]
}
]
}
];
console.log(JSON.stringify(input.map(refactor), null, 2));
.as-console-wrapper {
max-height: 100% !important;
}