首页 > 解决方案 > 如何在结构向量中执行 group_by?

问题描述

我不太明白如何group_by在 Rust 中使用(如果我理解正确的话,我需要这个函数)。这个例子尽可能抽象。我有一个结构体:

[
Temp 
 { user_id: 2, username: "test", role_id: 1, role: 123 }, 
Temp 
 { user_id: 2, username: "test", role_id: 2, role: 456 }
]

我想得到

User { 
 user_id: 2, 
 username: "test",
  roles: [
  Role {
   id: 1,
   role: 123
  },
  … etc
 ]
}

代码示例(游乐场):

#[derive(Debug)]
struct Temp {
    user_id: i32,
    username: String,
    role_id: i32,
    role: String,
}

#[derive(Debug)]
struct User {
    id: i32,
    username: String,
    roles: Vec<Role>,
}

#[derive(Debug)]
struct Role {
    id: i32,
    role: String,
}

fn main() {
    let temps_data = vec![
        Temp {
            user_id: 1,
            username: "test".to_string(),
            role_id: 1,
            role: "test1".to_string(),
        },
        Temp {
            user_id: 1,
            username: "test".to_string(),
            role_id: 2,
            role: "test2".to_string(),
        },
    ];

    // temps_data.group_by(|obj| {
    //     // I don't really understand what should be here
    // })

    // for example, what I want to get
    let result = vec![User {
        id: 1,
        username: "test".to_string(),
        roles: vec![
            Role {
                id: 1,
                role: "test1".to_string(),
            },
            Role {
                id: 2,
                role: "test2".to_string(),
            },
        ],
    }];
}

标签: rust

解决方案


我相信你正在尝试做这样的事情:

    let res: Vec<User> = temp_data
        .iter()
        .group_by(|x| (x.user_id, x.username.clone()))
        .into_iter()
        .map(|((id, username), group)| User {
            id, 
            username: username, 
            roles: Some(group.map(|u| Role {id: u.role_id, role: u.role.clone()}).collect()),
        })
        .collect();
    println!("{:?}", res);

// [User { id: 1, username: "test", roles: Some([Role { id: 1, role: "test1" }, Role { id: 2, role: "test2" }]) }]

这里是游乐场:https ://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=66e1b71bc919ff98e0f100aea3d0351a


推荐阅读