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

简化select2 option group所需JSON结构的转换代码

Select2 分组数据源转换逻辑简化方案

问题背景

在使用Select2插件开发时,需要结合templateResult配置项实现选项分组(optgroup)效果。根据官方文档要求,必须传入符合指定结构的对象数组才能正常启用分组功能。
现有编写的转换代码输出结果完全符合格式要求,但整个转换逻辑拆分为字段映射、分组聚合、结构调整3个独立步骤,存在冗余遍历,实现方式较为繁琐。
测试用原始数据源(数据库返回结果集,赋值给变量x)及原有实现代码如下:

let x = [
    {id_cp: 1, nama: 'Bank BJB', jenis: 'TB', path_gambar: '/assets/images/partners/bjb.png'},
    {id_cp: 2, nama: 'Bank BJB Giro Payment', jenis: 'GI', path_gambar: '/assets/images/partners/bjb.png'},
    {id_cp: 3, nama: 'CR Kantor Pusat', jenis: 'TN', path_gambar: '/assets/images/partners/tunai.png'},
    {id_cp: 4, nama: 'Bank BSI', jenis: 'TB', path_gambar: '/assets/images/partners/bsi.png'},
    {id_cp: 5, nama: 'Bank BRI', jenis: 'TB', path_gambar: '/assets/images/partners/bri.png'},
    {id_cp: 6, nama: 'Dana', jenis: 'EW', path_gambar: '/assets/images/partners/dana.png'},
    {id_cp: 7, nama: 'GoPay', jenis: 'EW', path_gambar: '/assets/images/partners/gopay.png'},
    {id_cp: 8, nama: 'Bank BRI', jenis: 'QR', path_gambar: '/assets/images/partners/qris.png'}
];

function selectLabel(arr) {
    arr = arr.map(function (elments) {
        return {
            id: elments.id_cp,
            text: elments.nama,
            jenis: elments.jenis,
            path_gambar: elments.path_gambar
        };
    });

    const outputGrouped = Object.values(arr.reduce((accu, {jenis, ...rest}) => {
        if(!accu[jenis]) {
            accu[jenis] = {jenis, children: []};
        }
        accu[jenis].children.push(rest);
        return accu;
    }, {}));
    
    const transformed = outputGrouped.map(({ jenis, children }) => ({
        text: jenis,
        children: children
    }));

    return transformed;
}

console.log(selectLabel(x));

优化方案

核心优化点是把三步操作合并到单次遍历中完成,消除两次冗余的数组遍历:

  • 字段重命名(id_cp映射为id、nama映射为text)直接在解构原始元素时处理,不需要单独执行一次map
  • 分组聚合时直接生成Select2要求的{text: 分组标识, children: 子选项数组}结构,不需要聚合完成后再执行一次结构转换的map
  • 去掉中间临时变量,直接返回聚合后的结果

简化后代码

function selectLabel(arr) {
  return Object.values(
    arr.reduce((acc, { id_cp: id, nama: text, jenis, path_gambar }) => {
      if (!acc[jenis]) acc[jenis] = { text: jenis, children: [] }
      acc[jenis].children.push({ id, text, path_gambar })
      return acc
    }, {})
  )
}

上述代码输出结果与原实现完全一致,仅对原数组做1次遍历,无中间冗余数组生成,逻辑更紧凑。


内容的提问来源于stack exchange,提问作者Taurus Silver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:45:39