常用JavaScript工具函数封装与优化

345 阅读4分钟

通用JavaScript方法封装

在现代Web开发中,许多应用程序都需要处理常见的操作,如日期格式化、表单重置、数据字典回显、树形结构数据构建等。为了提高开发效率并减少重复代码,我们可以将这些常用的操作封装成通用函数,以便在多个项目中复用。以下是一些常用的JavaScript方法封装,它们可以大大简化前端开发中的任务。

1. 日期格式化 parseTime

日期和时间的格式化是Web开发中经常遇到的需求,parseTime 方法能够将时间对象或时间戳格式化为指定格式的字符串。

javascript
复制代码
export function parseTime(time, pattern) {
  if (arguments.length === 0 || !time) {
    return null;
  }
  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
      time = parseInt(time);
    } else if (typeof time === 'string') {
      time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/.[\d]{3}/gm), '');
    }
    if ((typeof time === 'number') && (time.toString().length === 10)) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value]; }
    if (result.length > 0 && value < 10) {
      value = '0' + value;
    }
    return value || 0;
  });
  return time_str;
}

2. 表单重置 resetForm

在开发中,表单重置是一个常见需求。resetForm 方法可以快速清空表单中的所有数据,重置表单字段。

javascript
复制代码
export function resetForm(refName) {
  if (this.$refs[refName]) {
    this.$refs[refName].resetFields();
  }
}

3. 添加日期范围 addDateRange

在某些情况下,我们需要将用户选择的日期范围添加到请求参数中。addDateRange 方法能够将日期范围自动添加到请求参数中。

javascript
复制代码
export function addDateRange(params, dateRange, propName) {
  let search = params;
  search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
  dateRange = Array.isArray(dateRange) ? dateRange : [];
  if (typeof (propName) === 'undefined') {
    search.params['beginTime'] = dateRange[0];
    search.params['endTime'] = dateRange[1];
  } else {
    search.params['begin' + propName] = dateRange[0];
    search.params['end' + propName] = dateRange[1];
  }
  return search;
}

4. 数据字典回显 selectDictLabelselectDictLabels

在前端开发中,我们经常需要将后端返回的数值字典转化为用户友好的标签。selectDictLabelselectDictLabels 方法可以帮助你实现这一点。

javascript
复制代码
export function selectDictLabel(datas, value) {
  if (value === undefined) {
    return "";
  }
  var actions = [];
  Object.keys(datas).some((key) => {
    if (datas[key].value == ('' + value)) {
      actions.push(datas[key].label);
      return true;
    }
  })
  if (actions.length === 0) {
    actions.push(value);
  }
  return actions.join('');
}

export function selectDictLabels(datas, value, separator) {
  if (value === undefined || value.length === 0) {
    return "";
  }
  if (Array.isArray(value)) {
    value = value.join(",");
  }
  var actions = [];
  var currentSeparator = undefined === separator ? "," : separator;
  var temp = value.split(currentSeparator);
  Object.keys(value.split(currentSeparator)).some((val) => {
    var match = false;
    Object.keys(datas).some((key) => {
      if (datas[key].value == ('' + temp[val])) {
        actions.push(datas[key].label + currentSeparator);
        match = true;
      }
    })
    if (!match) {
      actions.push(temp[val] + currentSeparator);
    }
  })
  return actions.join('').substring(0, actions.join('').length - 1);
}

5. 字符串格式化 sprintf

字符串格式化是另一种常见需求,sprintf 方法可以将占位符 %s 替换为实际的参数。

javascript
复制代码
export function sprintf(str) {
  var args = arguments, flag = true, i = 1;
  str = str.replace(/%s/g, function () {
    var arg = args[i++];
    if (typeof arg === 'undefined') {
      flag = false;
      return '';
    }
    return arg;
  });
  return flag ? str : '';
}

6. 转换字符串为空 parseStrEmpty

在处理数据时,我们经常需要将 undefinednull 转换为空字符串。parseStrEmpty 方法可以帮助我们实现这一点。

javascript
复制代码
export function parseStrEmpty(str) {
  if (!str || str == "undefined" || str == "null") {
    return "";
  }
  return str;
}

7. 数据合并 mergeRecursive

mergeRecursive 方法可以将两个对象进行递归合并,合并过程中如果遇到对象类型的值会递归合并,非对象类型的值会覆盖源对象中的值。

javascript
复制代码
export function mergeRecursive(source, target) {
  for (var p in target) {
    try {
      if (target[p].constructor == Object) {
        source[p] = mergeRecursive(source[p], target[p]);
      } else {
        source[p] = target[p];
      }
    } catch (e) {
      source[p] = target[p];
    }
  }
  return source;
};

8. 构造树形结构数据 handleTree

构造树形结构数据在许多场景中都非常有用,特别是在处理菜单或组织结构数据时。handleTree 方法可以将扁平的数据转化为树形结构。

javascript
复制代码
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  };

  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];

  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }

  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      tree.push(d);
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t);
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  return tree;
}

9. 参数处理 tansParams

有时我们需要将对象格式的参数转化为查询字符串格式,tansParams 方法可以将对象中的嵌套属性转换为URL参数格式。

javascript
复制代码
export function tansParams(params) {
  let result = '';
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + "=";
    if (value !== null && value !== "" && typeof (value) !== "undefined") {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
            let params = propName + '[' + key + ']';
            var subPart = encodeURIComponent(params) + "=";
            result += subPart + encodeURIComponent(value[key]) + "&";
          }
        }
      } else {
        result += part + encodeURIComponent(value) + "&";
      }
    }
  }
  return result;
}

10. 获取标准路径 getNormalPath

getNormalPath 方法能够修正路径格式,确保路径符合标准。

javascript
复制代码
export function getNormalPath(p) {
  if (p.length === 0 || !p || p == 'undefined') {
    return p;
  };
  let res = p.replace('//', '/');
  if (res[res.length - 1] === '/') {
    return res.slice(0, res.length - 1);
  }
  return res;
}

11. 验证Blob格式 blobValidate

blobValidate 方法可以判断文件是否为非JSON格式的Blob对象。

javascript
复制代码
export function blobValidate(data) {
  return data.type !== 'application/json';
}

通过将这些通用的方法封装成独立的函数,我们能够提高开发效率,并减少重复代码。这些函数能够帮助开发者轻松实现常见的需求,如日期格式化、表单操作、树形结构处理等,进而提升整个项目的可维护性和开发体验。

4o