tools.js 5.15 KB
// eslint-disable
export const isObject = (obj) => {
  return obj
    ? Object.prototype.toString.call(obj) === "[object Object]"
    : false;
};
export const isArray = (arr) => {
  return arr ? Array.isArray(arr) : false;
};
/**
 * handle async await
 * @param {*} promise promise
 */
export const awaitWrap = (promise) =>
  promise.then((res) => [null, res]).catch((err) => [err, {}]);
/**
 * 深拷贝
 * @param {*} source
 */
export const deepClone = (source) => {
  if (!isObject(source) && !isArray(source)) return source;
  const targetObj = isArray(source) ? [] : {}; // 判断复制的目标是数组还是对象
  for (let keys in source) {
    // 遍历目标
    if (source.hasOwnProperty(keys)) {
      if (source[keys] && typeof source[keys] === "object") {
        // 如果值是对象,就递归一下
        targetObj[keys] = isArray(source[keys]) ? [] : {};
        targetObj[keys] = deepClone(source[keys]);
      } else {
        // 如果不是,就直接赋值
        targetObj[keys] = source[keys];
      }
    }
  }
  return targetObj;
};
/**
 * @description JS对象深度合并
 * @param {object} target 需要拷贝的对象
 * @param {object} source 拷贝的来源对象
 * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
 */
export const deepMerge = (target = {}, source = {}) => {
  target = deepClone(target);
  if (typeof target !== "object" || typeof source !== "object") return false;
  for (const prop in source) {
    if (!source.hasOwnProperty(prop)) continue;
    if (prop in target) {
      if (typeof target[prop] !== "object") {
        target[prop] = source[prop];
      } else if (typeof source[prop] !== "object") {
        target[prop] = source[prop];
      } else if (target[prop].concat && source[prop].concat) {
        target[prop] = target[prop].concat(source[prop]);
      } else {
        target[prop] = deepMerge(target[prop], source[prop]);
      }
    } else {
      target[prop] = source[prop];
    }
  }
  return target;
};
/**
 * 将File对象转为 Blob Url
 * @param {File} File对象
 * @returns Blob Url
 */
export const fileToBlob = (file) => {
  if (!file) return;
  const fileType = file.type;
  const blob = new Blob([file], { type: fileType || 'application/*' });
  const blobUrl = window.URL.createObjectURL(blob);
  return blobUrl;
};
/**
 * 将File对象转为 base64
 * @param {File} File对象
 * @returns base64
 */
export const fileToBase64 = (file) => {
  if (!file) return;
  return new Promise((r, j) => {
    const reader = new FileReader();
    reader.onloadend = () => {
      const base64String = reader.result;
      r(base64String);
    };
    reader.onerror = () => {
      j({ mode: 'fileToBase64', data: { errMsg: 'File to base64 fail.' } });
    };
    reader.readAsDataURL(file);
  });
};
/**
 * base64转临时路径(改自https://github.com/zhetengbiji/image-tools/blob/master/index.js)
 * @param base64
 * @returns
 */
function dataUrlToBase64(str) {
  var array = str.split(',');
  return array[array.length - 1];
};
function biggerThan(v1, v2) {
  var v1Array = v1.split('.');
  var v2Array = v2.split('.');
  var update = false;
  for (var index = 0; index < v2Array.length; index++) {
    var diff = v1Array[index] - v2Array[index];
    if (diff !== 0) {
      update = diff > 0;
      break;
    }
  }
  return update;
};
var index = 0;
function getNewFileId() {
  return Date.now() + String(index++);
};
export const base64ToPath = (base64, name = '') => {
  return new Promise((r, j) => {
    if (typeof plus !== 'object') {
      return j(new Error('not support'));
    }
    var fileName = '';
    if (name) {
      const names = name.split('.');
      const extName = names.splice(-1);
      fileName = `${names.join('.')}-${getNewFileId()}.${extName}`;
    } else {
      const names = base64.split(',')[0].match(/data\:\S+\/(\S+);/);
      if (!names) {
        j(new Error('base64 error'));
      }
      const extName = names[1];
      fileName = `${getNewFileId()}.${extName}`;
    }
    var basePath = '_doc';
    var dirPath = 'uniapp_temp';
    var filePath = `${basePath}/${dirPath}/${fileName}`;
    if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
      plus.io.resolveLocalFileSystemURL(basePath, function (entry) {
        entry.getDirectory(dirPath, {
          create: true,
          exclusive: false,
        }, function (entry) {
          entry.getFile(fileName, {
            create: true,
            exclusive: false,
          }, function (entry) {
            entry.createWriter(function (writer) {
              writer.onwrite = function () {
                r(filePath);
              }
              writer.onerror = j;
              writer.seek(0);
              writer.writeAsBinary(dataUrlToBase64(base64));
            }, j)
          }, j)
        }, j)
      }, j)
      return;
    }
    var bitmap = new plus.nativeObj.Bitmap(fileName);
    bitmap.loadBase64Data(base64, function () {
      bitmap.save(filePath, {}, function () {
        bitmap.clear();
        r(filePath);
      }, function (error) {
        bitmap.clear();
        j(error);
      });
    }, function (error) {
      bitmap.clear();
      j(error);
    });
  });
};