You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现将子组成员UID添加至父组的JS/Groovy脚本开发需求

Groovy 实现子组成员合并到父组

这里提供一个Groovy脚本,专门处理你描述的LDAP组数据合并需求——把包含在父组里的子组的所有用户成员,直接添加到父组的成员列表中:

@Grab('org.codehaus.groovy:groovy-json:3.0.17')
import groovy.json.JsonSlurper

def inputFile = new File('input-groups.json') // 替换成你的入站文件路径
def slurper = new JsonSlurper()

// 存储子组映射:子组cn -> 子组的用户成员列表
def subgroupMap = [:]

// 第一步:先收集所有子组数据
inputFile.eachLine { line ->
    def group = slurper.parseText(line)
    def groupCn = group.cn[0]
    // 判断是否是子组(LEGG开头)
    if (groupCn.startsWith('LEGG-')) {
        // 提取子组的用户成员(只保留uid开头的成员)
        def userMembers = group.member.findAll { it.startsWith('uid=') }
        subgroupMap[groupCn] = userMembers
    }
}

// 第二步:处理父组,合并子组成员
inputFile.eachLine { line ->
    def group = slurper.parseText(line)
    def groupCn = group.cn[0]
    // 判断是否是父组(LEG开头)
    if (groupCn.startsWith('LEG-')) {
        def updatedMembers = [] as Set // 用Set自动去重
        updatedMembers.addAll(group.member)
        
        group.member.each { member ->
            // 检查成员是否是子组DN(格式为cn=LEGG-xxx,...)
            if (member.startsWith('cn=LEGG-')) {
                // 提取子组的cn名称
                def subgroupCn = member.split(',')[0].replace('cn=', '')
                // 如果子组存在,添加其用户成员
                if (subgroupMap.containsKey(subgroupCn)) {
                    updatedMembers.addAll(subgroupMap[subgroupCn])
                }
            }
        }
        
        // 输出处理后的父组数据(可修改为写入文件)
        println groovy.json.JsonOutput.toJson([
            cn: group.cn,
            member: updatedMembers.toList()
        ])
    }
}

脚本说明

  • 自动依赖Groovy JSON解析库,无需手动下载
  • 用Set存储成员,避免重复添加同一用户
  • 完全适配你提供的每行独立JSON的输入格式
  • 处理后保留父组原有成员,同时追加对应子组的所有用户成员

Node.js(JavaScript)实现方案

如果偏好JavaScript,以下是Node.js环境下的实现脚本:

const fs = require('fs');

const inputFilePath = './input-groups.json'; // 替换为你的入站文件路径
const lines = fs.readFileSync(inputFilePath, 'utf8').split('\n').filter(line => line.trim());

// 存储子组映射:子组cn -> 用户成员列表
const subgroupMap = {};

// 第一步:收集子组数据
lines.forEach(line => {
    try {
        const group = JSON.parse(line);
        const groupCn = group.cn[0];
        if (groupCn.startsWith('LEGG-')) {
            // 过滤出用户成员(uid开头)
            const userMembers = group.member.filter(member => member.startsWith('uid='));
            subgroupMap[groupCn] = userMembers;
        }
    } catch (e) {
        console.error(`解析行失败: ${line}`, e);
    }
});

// 第二步:处理父组,合并子组成员
lines.forEach(line => {
    try {
        const group = JSON.parse(line);
        const groupCn = group.cn[0];
        if (groupCn.startsWith('LEG-')) {
            const updatedMembers = new Set(group.member); // 去重
            
            group.member.forEach(member => {
                if (member.startsWith('cn=LEGG-')) {
                    const subgroupCn = member.split(',')[0].replace('cn=', '');
                    if (subgroupMap[subgroupCn]) {
                        subgroupMap[subgroupCn].forEach(user => updatedMembers.add(user));
                    }
                }
            });
            
            // 输出处理后的父组
            console.log(JSON.stringify({
                cn: group.cn,
                member: Array.from(updatedMembers)
            }));
        }
    } catch (e) {
        console.error(`解析行失败: ${line}`, e);
    }
});

脚本说明

  • 依赖Node.js环境运行
  • 加入错误捕获,避免单行文法错误导致整个脚本崩溃
  • 同样通过Set实现成员去重逻辑

内容的提问来源于stack exchange,提问作者Srinu Varma Moka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:21:43