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

3
我有一个看起来像这样的对象数组。
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和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 }]
  };
});

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

3个回答

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);

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

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; }


实现时会添加很多 TypeScript 错误。有更简单的版本吗?或者可能有 TypeScript 版本的这个? - user16860065
抱歉,我不知道 TypeScript。 - Nina Scholz

0
一个简单的递归函数:
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;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接