package com.bonus.common.core.utils;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

/**
 * @className:BuildTreeUtil
 * @author:cwchen
 * @date:2024-08-08-16:15
 * @version:1.0
 * @description:构建树
 */
public class BuildTreeUtil {

    public static JSONArray listInfoToTree(JSONArray arr, String id, String pid, String child) {
        JSONArray ret = new JSONArray();
        // 将数据直接构建成为hash
        JSONObject hash = new JSONObject();
        // 节点大小
        int size = arr.size();
        // 将数组转为Object的形式，key为数组中的id，并组装为map
        for (int i = 0; i < size; i++) {
            JSONObject json = (JSONObject) arr.get(i);
            hash.put(json.getString(id), json);
        }
        // 遍历结果集
        for (int j = 0; j < size; j++) {
            // 单条记录
            JSONObject nodeVal = (JSONObject) arr.get(j);
            // 在hash中取出key为单条记录中pid的值
            JSONObject hashParent = (JSONObject) hash.get(nodeVal.get(pid).toString());
            // 如果记录的pid存在，则说明它有父节点，将她添加到孩子节点的集合中（这里与刚才所说的所有parentId为空的节点填充一个projectid并不冲突，因为当填入projectId的时候，hashParent是get不到值的）
            if (hashParent != null) {
                // 构造child属性
                if (hashParent.get(child) != null) {
                    JSONArray chArr = (JSONArray) hashParent.get(child);
                    chArr.add(nodeVal);
                    hashParent.put(child, chArr);
                } else {
                    JSONArray chArr = new JSONArray();
                    chArr.add(nodeVal);
                    hashParent.put(child, chArr);
                }
            } else {
                ret.add(nodeVal);
            }
        }
        return ret;
    }
}
