【问题标题】:How to re arrange an array in TypeScript如何在 TypeScript 中重新排列数组
【发布时间】:2021-01-28 09:26:03
【问题描述】:

我有一个包含如下对象的数组,

var users = [{
    id: 1,
    name: 'Swamy',
    category_id: 1,
    category_name: "Male"
  },
  {
    id: 2,
    name: 'Mahesh',
    category_id: 1,
    category_name: "Male"
  },
  {
    id: 3,
    name: 'Kajal',
    category_id: 2,
    category_name: "Female"
  },
  {
    id: 4,
    name: 'Rasi',
    category_id: 2,
    category_name: "Female"
  }
]

我想根据类别重新安排以上内容

var cat_users = [{
    category_id: 1,
    category_name: "Male",
    users: [{
      id: 1,
      name: 'Swamy'
    }, {
      id: 2,
      name: 'Mahesh'
    }]
  },
  {
    category_id: 2,
    category_name: "Female",
    users: [{
      id: 3,
      name: 'Kajal'
    }, {
      id: 4,
      name: 'Rasi'
    }]
  },
]

我正在寻找解决方案,但似乎找不到任何相关内容。请帮忙重新排列数组。

【问题讨论】:

  • Array 自带排序功能,可以提供自定义比较的功能。示例here.
  • 搜索“group by”,你会发现很多类似的问题。

标签: javascript arrays typescript javascript-objects


【解决方案1】:

您必须查找您的排序数组中是否存在category_id。如果没有,则推送一个新条目。如果是,则将该用户添加到该条目的用户中。

interface User {
    id: number;
    name: string;
};

interface Category {
    category_id: number;
    category_name: string;
}

interface Entry extends User, Category { }

interface SortedEntry extends Category {
    users: Array<User>;
}

var users: Array<Entry> = [
    {
        id: 1,
        name: 'Swamy',
        category_id: 1,
        category_name: "Male"
    },
    {
        id: 2,
        name: 'Mahesh',
        category_id: 1,
        category_name: "Male"
    },
    {
        id: 3,
        name: 'Kajal',
        category_id: 2,
        category_name: "Female"
    },
    {
        id: 4,
        name: 'Rasi',
        category_id: 2,
        category_name: "Female"
    }
];

const sorted: Array<SortedEntry> = [];

for (const { id, name, category_name, category_id } of users) {
    const match = sorted.find((entry) => entry.category_id === category_id);
    if (!match) {
        sorted.push({
            category_id,
            category_name,
            users: [
                {
                    id,
                    name,
                }
            ]
        });
    }
    else {
        match.users.push({
            id,
            name,
        });
        const index = sorted.indexOf(match);
        sorted[index] = match;
    }
}

console.log(sorted);

【讨论】:

    【解决方案2】:

    首先,基于input,您可以使用Array.reducecategory_id对该输入进行分组。

    groupedBy 对象,您可以使用Array.map 生成您想要的结果。

    var users = [{
        id: 1,
        name: 'Swamy',
        category_id: 1,
        category_name: "Male"
      },
      {
        id: 2,
        name: 'Mahesh',
        category_id: 1,
        category_name: "Male"
      },
      {
        id: 3,
        name: 'Kajal',
        category_id: 2,
        category_name: "Female"
      },
      {
        id: 4,
        name: 'Rasi',
        category_id: 2,
        category_name: "Female"
      }
    ];
    
    const groupBy = users.reduce((acc, cur) => {
      acc[cur.category_id] ? acc[cur.category_id].users.push({
        id: cur.id,
        name: cur.name
      }) : acc[cur.category_id] = {
        category_id: cur.category_id,
        category_name: cur.category_name,
        users: [{
          id: cur.id,
          name: cur.name
        }]
      };
      return acc;
    }, {});
    
    const result = Object.entries(groupBy).map(([ category_id, rest ]) => ({
      category_id,
      ...rest
    }));
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2015-08-20
      • 2023-03-27
      • 2015-05-12
      相关资源
      最近更新 更多