Saber2pr's Blog

CommonToolFunctionPackage

export const isUndefined = (val: any): val is undefined => typeof val === 'undefined';

export const isNull = (val: any): val is null => val === null;

/**
 * 值不存在
 */
export const isNullOrUndefined = (val: any) => isNull(val) || isUndefined(val);

/**
 * 值存在
 */
export const isNotNullOrUndefined = (val: any) => !isNullOrUndefined(val);

export const isJSON = (str: string) => {
  if (typeof str === 'string') {
    try {
      const obj = JSON.parse(str);
      if (typeof obj === 'object' && obj) {
        return true;
      } else {
        return false;
      }
    } catch (e) {
      return false;
    }
  } else {
    return false;
  }
};

/**
 * 将数组等分割
 */
export const splitArray = <T>(list: T[], interval = 4) => {
  const array = getArray(list);
  const result: T[][] = [];
  let temp: T[] = [];
  for (const item of array) {
    temp.push(item);
    if (temp.length === interval) {
      result.push(temp);
      temp = [];
    }
  }
  if (temp.length) {
    result.push(temp);
  }

  return result;
};

export const getArray = <T>(array: T[]) => (Array.isArray(array) ? array : []);

export const toArray = <T>(array: T | T[]): T[] =>
  Array.isArray(array) ? [].concat(array) : array ? [array] : [];

/**
 * 对象数组去重
 */
export const dedup = <T>(array: T[], compare: (a: T, b: T) => boolean) =>
  getArray(array).reduce(
    (acc, item) => (acc.find(i => compare(i, item)) ? acc : acc.concat(item)),
    []
  );

export const buildMap = <T>(arr: T[], key: keyof T): Record<string, T> =>
  getArray(arr).reduce(
    (acc, item) => (isNotNullOrUndefined(item[key]) ? { ...acc, [item[key] as any]: item } : acc),
    {}
  );

export const merge = <T>(...objs: Array<Partial<T>>): Partial<T> => {
  let result: Partial<T> = {};
  for (const obj of objs) {
    result = { ...result, ...(obj || {}) };
  }
  return result;
};