如何解决如何在TypeScript中重新排列数组
var users = [{
id: 1,name: 'Swamy',category_id: 1,category_name: "Male"
},{
id: 2,name: 'Mahesh',{
id: 3,name: 'Kajal',category_id: 2,category_name: "Female"
},{
id: 4,name: 'Rasi',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'
}]
},]
我正在寻找解决方案,似乎找不到任何相关的内容。请帮助重新排列阵列。
解决方法
首先,基于input
,您可以使用category_id
按Array.reduce
将输入分组。
然后从该groupedBy
对象中,可以使用Array.map
生成所需的结果。
var users = [{
id: 1,name: 'Swamy',category_id: 1,category_name: "Male"
},{
id: 2,name: 'Mahesh',{
id: 3,name: 'Kajal',category_id: 2,category_name: "Female"
},{
id: 4,name: 'Rasi',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);
,
您必须查找已排序数组中是否存在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,category_name: "Male"
},{
id: 2,{
id: 3,category_name: "Female"
},{
id: 4,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,users: [
{
id,}
]
});
}
else {
match.users.push({
id,});
const index = sorted.indexOf(match);
sorted[index] = match;
}
}
console.log(sorted);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。