SOURCE

/**
 * @description 判断是否为object对象
 * @param data
 * @return {boolean}
 * @createTime 2021/4/13 17:22
 * @author Admin
 */
function isObject(data) {
  return data.constructor === Object
}

/**
 * @description 判断是否为数字
 * @param data
 * @author Admin
 * @createTime 2021/4/13 17:25
 * @version 1.0
 * @return {boolean}
 */
function isNumber(data) {
  return data.constructor === Number
}
/**
 * @description 判断是否为字符串
 * @param data
 * @author Admin
 * @createTime 2021/4/13 17:26
 * @version 1.0
 * @return {boolean}
 */
function isString(data) {
  return data.constructor === String
}
/**
 *@description 判断是否为数组
 * @param data
 * @author Admin
 * @createTime 2021/4/13 17:27
 * @version 1.0
 * @return {boolean}
 */
function isArray(data) {
  return data.constructor === Array
}
/**
 *@description 判断是否为函数
 * @param data
 * @author Admin
 * @createTime 2021/4/13 17:28
 * @version 1.0
 * @return {boolean}
 */
function isFunction(data) {
  return data.constructor === Function
}
/**
 * 判断是否为JSON数据。JSON.parse()能解析成功,那么str是json字符串。
 * @param str
 * @returns {boolean}
 */
function isJSON(str) {
  if (typeof str == "string" && str) {
    try {
      JSON.parse(str)
      return true;
    } catch (e) {
      return false;
    }
  }
}
/**
 * json字符串转数组
 * @param str json字符串
 * @returns {*[]} 返回的数组
 */
export function toArray (str) {
  if (str === '' || str == null || str === undefined) {
    return []
  }
  if (isArray(str)) {
    return str
  }
  if (isJSON(str)) {
    return JSON.parse(str)
  }
}

/**
 * json字符串转对象
 * @param str json字符串
 * @returns {{}} 返回的对象
 */
export function toObject (str) {
  if (str === '' || str == null || str === undefined) {
    return {}
  }
  if (isObject(str)) {
    return str
  }
  if (isJSON(str)) {
    return JSON.parse(str)
  }
}

/**
 * @description 将数据转为树型结构。
 * 将数据分为最外层的父节点和孩子节点。
 * 在子节点中找父节点的直接节点,将其从当前子节点中剔除。
 * 递归回到1,寻找子节点的子节点。
 * 如果当前子节点不是任何节点的父节点,将该子节点放入父节点的children集合中
 * @param data 数组数据源
 * @param option 配置fid、pid对应关系。默认fid:id,pid:pid
 * @return 返回树
 * @author Admin
 * @createTime 2021/4/13 13:29
 * @version 1.0
 **/
function getTree(data,option = {fid: 'id', pid: 'pid'}) {
  const parents = data.filter((item) => item[option.pid] === 0);
  const children = data.filter((item) => item[option.pid] !== 0);
  toTree(parents, children);
  return parents;
  function toTree(parents, children) {
    for (let i = 0; i < parents.length; ++i) {
      for (let j = 0; j < children.length; ++j) {
        if (children[j][option.pid] === parents[i][option.fid]) {
          toTree([children[j]], children);
          if (parents[i].children) {
            parents[i].children.push(children[j]);
          } else {
            parents[i].children = [children[j]];
          }
        }
      }
    }
  }
}

/**
 * @description 深度克隆。属性值为object时,判断是否时对象数组。再继续递归深度克隆;否则为当前值
 * @param  source:克隆对象 target:克隆结果对象
 * @return 返回克隆结果对象
 * @author Admin
 * @createTime 2021/4/13 13:21
 * @version 1.0
 */
function deepClone(source, target) {
  let _tar = target || {};
  let keys = Reflect.ownKeys(source);
  keys.map((key) => {
    if (typeof source[key] === "object") {
      _tar[key] =
        Object.prototype.toString.call(source[key]) === "[object Array]"
          ? []
          : {};
      deepClone(source[key], _tar[key]);
    } else {
      _tar[key] = source[key];
    }
  });
  return _tar;
}

/**
 * @description 对象是无序的,直接返回。数据有内容时,判断对象是否含有排序依据order;若有进行比较,否则直接返回
 * @param data 需要排序的对象
 * @param order 排序的类型
 * @param desc 根据order进行排序。desc: 1为升序, -1为降序
 */
function sortedOrderBy(data, order = '', desc = 1 ) {
  let res
  if (Array.isArray(data)) {
    if (data.length === 0 ){
      res = data
      return res
    } else if (isObject(data[0])) {

      if ( order in data[0] ) {
        res = data.sort((a, b) => {
          if (typeof a[order] === 'string') {
            if (order.includes("time")) {
              let dateA = new Date(a[order]).getTime()
              let dateB = new Date(b[order]).getTime()
              return (dateA > dateB ? 1 : -1) * desc
            }
            return (a[order] >= b[order] ? a[order] === a[order] ? 0 : 1 : -1) * desc
          }
          if (typeof a[order] === 'number') {
            return ( a[order] - b[order] ) * desc
          }
        });
      }else {
        res = data
      }
    }else {
      res = data.sort((a, b) => {
        return (a >= b ? a === a ? 0 : 1 : -1) * desc
      })
    }
  }else {
    res = data
  }
  return res
}
/**
 * @description 得到排序树,
 * @param  tree 排序的树, orderBy 排序依据, desc:1为升序,-1为降序
 * @return []
 * @author Admin
 * @createTime 2021/4/13 13:26
 * @version 1.0
 */
function SortTree(tree, orderBy, desc) {
  if (orderBy === '' || orderBy  === undefined) {
    return tree;
  }else {
    tree = sortedOrderBy(tree, orderBy, desc)
    tree.map((t) => {
      if (t.children) {
        t.children = SortTree(t.children, orderBy, desc);
      }
    });
  }
  return tree;
}


/**
 * @description 将data数组转化为排序树
 * @param data data数组转为树再配许
 * @param orderBy 排序依据。默认为空
 * @param desc 升降序。1为升序,-1为降序。默认升序
 * @param option 树的层级配置。默认fid为id,pid为pid
 * @return [] 返回数组对象
 * @author Admin
 * @createTime 2021/4/13 15:21
 * @version 1.0
 */
function getSortedTree(data, orderBy = '', desc = 1,option = {fid: 'id', pid: 'pid'}) {
  let temp = getTree(data,option)
  return SortTree(temp, orderBy, desc)
}

function getExportFields(table){
  let res = []
  this.$refs[table].$children.forEach(obj => {
    if(obj.label) {
      console.log(obj)
      res.push(obj.label)
    }
  })
  return res;
}
export  default function (Vue) {
  Vue.prototype.$JSONutils = {
    toArray,
    toObject,
    sortedOrderBy,
    getTree,
    getSortedTree,
    getExportFields
  }
}
console 命令行工具 X clear

                    
>
console