Javascript 常用的工具函数,更新中...

时间戳转为格式化时间

/**
 * 时间戳转为格式化时间
 * @Author   chenjun
 * @DateTime 2017-11-10
 * @param    {[date]}   timestamp [时间戳]
 * @param    {[string]}   formats   [时间格式]
 */
function formatDate(timestamp, formats) {
    /*
    formats格式包括
    1. Y-M-D
    2. Y-M-D h:m:s
    3. Y年M月D日
    4. Y年M月D日 h时m分
    5. Y年M月D日 h时m分s秒
    示例:console.log(formatDate(1500305226034, 'Y年M月D日 h:m:s')) ==> 2017年07月17日 23:27:06
     */
    formats = formats || 'Y-M-D';

    var myDate = timestamp ? new Date(timestamp) : new Date();

    var year = myDate.getFullYear();
    var month = formatDigit(myDate.getMonth() + 1);
    var day = formatDigit(myDate.getDate());

    var hour = formatDigit(myDate.getHours());
    var minute = formatDigit(myDate.getMinutes());
    var second = formatDigit(myDate.getSeconds());

    return formats.replace(/Y|M|D|h|m|s/g, function(matches) {
        return ({
            Y: year,
            M: month,
            D: day,
            h: hour,
            m: minute,
            s: second
        })[matches];
    });
    // 小于10补0
    function formatDigit(n) {
        return n.toString().replace(/^(\d)$/, '0$1');
    };
}

千分位显示,常用于价格显示:

// 千分位
function toThousands(num) {
    return parseFloat(num).toFixed(2).replace(/(\d{1,3})(?=(\d{3})+(?:\.))/g, "$1,");
}

超出显示省略号

// 超出显示省略号
function cutString(str, len) {
    //length属性读出来的汉字长度为1
    if (str.length * 2 <= len) {
        return str;
    }
    var strlen = 0;
    var s = "";
    for (var i = 0; i < str.length; i++) {
        s = s + str.charAt(i);
        if (str.charCodeAt(i) > 128) {
            strlen = strlen + 2;
            if (strlen >= len) {
                return s.substring(0, s.length - 1) + "...";
            }
        } else {
            strlen = strlen + 1;
            if (strlen >= len) {
                return s.substring(0, s.length - 2) + "...";
            }
        }
    }
    return s;
}

生成随机整数

// 生成随机整数
function random(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

生成uuid

function getuuid() {
    var s = [];
    var hexDigits = "0123456789abcdef";
    for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
    s[8] = s[13] = s[18] = s[23] = "-";

    var uuid = s.join("");
    return uuid;
}

获取url参数,兼容hash后的参数(可获取中文参数)

function getQueryString(name) {
    let search = window.location.search.substr(1) || window.location.hash.split('?')[1];
    let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
    if (!search) return;
    let r = search.match(reg);
    if (r != null) return decodeURI(r[2]);
    return null;
}

手写clone深拷贝函数

function clone(obj) {
    var result = null;
    if (obj instanceof Array) {
        result = [];
        for (var i = 0; i < obj.length; i++) {
            result[i] = clone(obj[i]);
        }
        return result;
    } else if (obj instanceof Object) {
        result = {};
        for (var i in obj) {
            result[i] = clone(obj[i]);
        }
        return result;
    } else {
        return obj;
    }
}
console.log(clone({ "a": 1, "b": 2, "c": [1, 3] }));

将10进制数字转为32字节二进制数;

# 方法一、
function intToBytes32(data) {
  var binary = '';
  for (var i = 0; i < 32; i++) {
    binary += (data >> (31 - i)) & 1;
  }
  console.log(binary);
}
intToBytes32(28);// ===> 00000000000000000000000000011100
# 方法二:
function intToBytes32(data) {
  var binary = data.toString(2);
  var s = '00000000000000000000000000000000';
  console.log(s.substr(0, s.length - binary.length) + binary);
}

交换数组前后两个位置

function togglePosition(arr, flag) {
  for (var i = 0; i < arr.length; i++) {
    if (arr.length % 2 == 0) {
      for (var j = 1; j < arr.length - 1; j++) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    } else {
      for (var j = 1; j < arr.length; j++) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
  return flag ? arr.reverse() : arr;
};
var arr = [12, 13, 14, 15, 16, 17];
togglePosition(arr, false) // ==>[14, 12, 15, 14, 17, 16]

数组扁平化

取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中,如: [1, [3, [2, 4]]] ==> [1, 3, 2, 4],实现方法:递归 + concat

// 方法一:
function flat1(arr) {
    // 准备结果数组
    const result = [];
    // 循环
    for (let i = 0; i < arr.length; i++) {
        // 如果是数组
        if (Array.isArray(arr[i])) {
            // 递归 展开 推入
            result.push(...flat1(arr[i]));
            // result = result.concat(flatten(arr[i]))
        } else {
            result.push(arr[i]);
        }
    }
    // 返回
    return result;
}

// 测试
const arr = [1, 2, [3, 4, [5, 6]], 7];
const newArr = flat1(arr);
console.log(newArr); // [1, 2, 3, 4, 5, 6, 7]

// 方法二:
function flat2(arr) {
    // 浅克隆传入数组 不改变原数组
    let result = [...arr];

    // 当数组里面有一个数组时
    while (result.some((item) => Array.isArray(item))) {
        // 展开合并
        result = [].concat(...result);
    }
    // 返回
    return result;
}

数组分块

语法: chunk(array, size),功能: 将数组拆分成多个 size 长度的区块,每个区块组成小数组,整体组成一个二维数组,如: [1, 3, 5, 6, 7, 8] 调用chunk(arr, 4) ==> [[1, 3, 5, 6], [7,8]]

function chunk(arr, size = 1) {
    // 准备结果和临时数组
    const result = [];
    let temp = [];
    // 遍历
    arr.forEach((item) => {
        // 当临时数组为空推入结果数组
        if (temp.length === 0) {
            result.push(temp);
        }
        // 往临时数组推入数组项
        temp.push(item);
        // 当推入数组项达到传入分块长度时重新赋值空数组循环判断 直到循环结束返回
        if (temp.length === size) {
            temp = [];
        }
    });
    // 返回
    return result;
}

// 测试
const arr = [1, 2, 3, 4, 5, 6, 7];
const newArr = chunk(arr, 3);
console.log(newArr); // [[1, 2, 3], [4, 5, 6], [7]]
posted @ 2017-11-10 18:16  Jone_chen  阅读(740)  评论(0编辑  收藏  举报