import _extends from "@babel/runtime/helpers/extends";
import getChildren from "./getChildren";
/**
 *
 * 将平行数组转换为树形结构
 * @category 数组
 * @function arrayToTree
 * @param array 数据集合
 * @returns  {object} 树形结构
 * @static
 * @author libo
 * @param {Object} option - 参数配置.
 * @param {string} option.parentFiled - 父级指向字段标识，默认值'parent'。
 * @param {string} option.keyFiled - 唯一标识字段标识,默认值'id'。
 * @param {string} option.childFiled - 树形结构的子字段，默认值'children'。
 * @param {string} option.returnType - 返回数据类型  支持tree和object，默认值'tree'。
 * @param {string} option.isDeep - 是否深拷贝，默认值false。
 *
 * 等价 'parent'
 * @example example 01 默认使用
 * --------------------------------------------------------------------------
 * import { arrayToTree } from "@riil-frontend/utils";
 * const array = [
 *     { id: 1, value: 1, parent: null },
 *     { id: 2, value: 2, parent: 1 }
 * ];
 * arrayToTree(array);
 * // result
 * [
 *   {
 *     "id": 1,
 *     "value": 1,
 *     "parent": null,
 *     "children": [
 *       {
 *         "id": 2,
 *         "value": 2,
 *         "parent": 1,
 *         "children": []
 *       }
 *     ]
 *   }
 * ]
 *
 * @example example 02 返回对象格式 便捷获取某个节点数据的及所有子数据
 * --------------------------------------------------------------------------
 * const array = [
 *     { id: 1, value: 1, parent: null },
 *     { id: 2, value: 2, parent: 1 }
 * ];
 * arrayToTree(array,{returnType:'object'});
 *
 * // result
 * {
 *   "1": {
 *     "id": 1,
 *     "value": 1,
 *     "parent": null,
 *     "children": [
 *       {
 *         "id": 2,
 *         "value": 2,
 *         "parent": 1,
 *         "children": []
 *       }
 *     ]
 *   },
 *   "2": {
 *     "id": 2,
 *     "value": 2,
 *     "parent": 1,
 *     "children": []
 *   }
 * }
 *
 */

export var arrayToTree = function arrayToTree(array, option) {
  if (!array || !array.length) return option && option.returnType === 'object' ? {} : [];
  var opt = {
    parentFiled: 'parent',
    keyFiled: 'id',
    childFiled: 'children',
    returnType: 'tree'
  };
  typeof option === 'string' ? opt.parentFiled = option : opt = _extends({}, opt, option);
  var temp = {};
  var first = [];
  array.map(function (obj) {
    return temp[obj[opt.keyFiled]] = obj;
  }); // 查处所有的一级菜单

  array.map(function (current) {
    var parent = current[opt.parentFiled]; // parent字段不存在 或者paren字段不存在父级

    if (!parent || !temp[parent]) {
      first.push(current);
    }
  }); // 根据一级菜单获取所有孩子节点

  first && first.map(function (firstChild) {
    firstChild[opt.childFiled] = getChildren(firstChild, opt, array);
  });
  return opt.returnType === 'object' ? temp : first;
};