## 集合操作

magic-script 为 List 和 Map 提供了丰富的链式操作方法。

### List 遍历与转换
```magicscript
var list = [{name: '张三', age: 20, dept: 'IT'}, {name: '李四', age: 30, dept: 'HR'}]

// 遍历
list.each(it => log.info('name: {}', it.name))

// 映射转换
var names = list.map(it => it.name)
// ['张三', '李四']

// 过滤
var young = list.filter(it => it.age < 25)

// 查找
var found = list.find(it => it.name == '张三')
```

### 排序
```magicscript
// 自然排序
var sorted = list.sort((a, b) => a.age - b.age)

// 反转
var reversed = list.reverse()

// 去重
var unique = list.distinct()
```

### 聚合
```magicscript
var ages = [20, 25, 30, 35, 40]
ages.sum()      // 150
ages.avg()      // 30
ages.max()      // 40
ages.min()      // 20
ages.first()    // 20
ages.last()     // 40
list.size()     // 5
```

### 截取
```magicscript
list.skip(2)        // 跳过前2个
list.limit(5)       // 取前5个
list.skip(2).limit(5)  // 跳过2个取5个
list.concat(list2)  // 合并列表
```

### 分组
```magicscript
// 按部门分组
var grouped = list.group(it => it.dept)
// {IT: [{...}], HR: [{...}]}

// 分组并聚合
var deptCount = list.group(it => it.dept, items => items.size())
// {IT: 3, HR: 2}
```

### 提示：分组统计优先用 SQL
如果只需要分组统计数量，优先使用 SQL 的 GROUP BY，比内存分组更高效：
```magicscript
// 推荐：直接用 SQL 分组统计
return db.select('select dept_id, count(*) as count from user group by dept_id order by count desc')
```

### 关联（Join）
```magicscript
var users = db.select('select * from user')
var depts = db.select('select * from department')

// 关联两个列表
var result = users.join(depts, (u, d) => u.dept_id == d.id)
    .map(it => {
        name: it.name,
        deptName: it.dept_name
    })
```

### Map 操作
```magicscript
var map = {a: 1, b: 2, c: 3}
map.each((key, value) => log.info('{}: {}', key, value))

// Map 转 List
var list = map.asList((key, value) => {k: key, v: value})

// Map 排序
map.sort((k1, k2, v1, v2) => v2 - v1)
```

### List 转 Map
```magicscript
var userMap = list.toMap(it => it.id)
// {1: {id:1, name:'张三'}, 2: {id:2, name:'李四'}}
```

### 树结构转换
```magicscript
var toTree = (list, parentId) => {
    return list.filter(it => it.parent_id == parentId)
        .each(it => {
            it.children = toTree(list, it.id)
        })
}
var allDepts = db.select('select id, name, parent_id from department')
return toTree(allDepts, '0')
```