js 日常编程工具函数

js 分享一些简洁的处理日常工具函数。

字符串类

反转字符串

export function reverseString(str) {
  return [...str].reverse().join("");
}
//示例
let str = reverseString("hello");
console.log(str); //olleh

字符串去重

export function stringFilter(str) {
  return [...new Set(Array.from(str))].join("");
}
//示例
let str = stringFilter("apple");
console.log(str); //'aple'

查找给定单词,并且替换为另一词汇

export function findAndReplace(str, wordToFind, wordToReplace) {
  return str.split(wordToFind).join(wordToReplace);
}
//示例
let result = findAndReplace("I like banana", "banana", "apple");
console.log(result); //I like apple

将字符串中所有单词的首字母大写

export function capitalizeAllWords(str) {
  return str.replace(/\b[a-z]/g, (char) => char.toUpperCase());
}
//示例
let str = capitalizeAllWords("i love reading book");
console.log(str); //I Love Reading Book

字符串转换为一个单词数组

export function toWords(str, parent = /[^a-zA-Z-]+/) {
  return str.split(parent).filter((item) => item);
}
//示例
let words = toWords("I want to be come a great programmer");
console.log(words); //['I', 'want', 'to', 'be', 'come', 'a', 'great', 'programmer']

随机产生一个十六进制的值

export function getColor() {
  return (
    "#" +
    "0123456789abcdef"
      .split("")
      .map((v, i, a) => {
        return i > 5 ? null : a[Math.floor(Math.random() * 16)];
      })
      .join("")
  );
}
//示例
console.log(getColor()); //'#2ebe3e'

url 参数解析

export function urlParse(url) {
  let obj = {};
  let reg = /[?&][^?&]+=[^?&]+/g;
  let arr = url.match(reg);
  if (arr) {
    arr.forEach((item) => {
      let tempArr = item.substring(1).split("=");
      console.log(tempArr);
      let key = tempArr[0];
      let val = tempArr[1];
      obj[key] = val;
    });
  }
  return obj;
}
//示例
console.log(urlParse("https://mp.csdn.net?id=123456&a=b")); //{id:"123456",a:"b"}

字符串超出长度中间增加…切片

export function strEllipsis(str, maxLength) {
  // 字符串长度小于等于 maxLength,无需截断,直接返回原字符串
  if (str.length <= maxLength) return str;
  const ellipsis = "...";
  const halfLength = Math.floor((maxLength - ellipsis.length) / 2);
  const start = str.slice(0, halfLength);
  const end = str.slice(str.length - halfLength);
  return start + ellipsis + end; // 使用省略号连接前半部分和后半部分
}
//示例
console.log(strEllipsis("abcdefg", 5)); //'a...g'

数值类

返回给定数的平均数

export function averageOf(...numbers) {
  return numbers.reduce((a, b) => a + b, 0) / numbers.length;
}
//示例
let average = averageOf(5, 2, 4, 7);
console.log(average); //4.5

返回给定数的和

export function sumOf(...nums) {
  return nums.reduce((a, b) => a + b, 0);
}

//示例
let sum = sumOf(5, -3, 2, 1);
console.log(sum); //5

数字进行有效性验证

export function isValidNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n) && Number(n) === n;
}

//示例
let check = isValidNumber("a");
console.log(check); //false

将 RGB 模式下的颜色转换为十六进制

export function RGBTOHex(r, g, b) {
  return ((r << 16) + (g << 8) + b).toString(16).padStart(6, "0");
}

//示例
let hex = RGBTOHex(255, 255, 255);
console.log(hex); //ffffff

生成指定区间的随机整数

export function randomNum(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
}

//示例
let num = randomNum(2, 10);
console.log(num); //5

斐波拉数列

export function fibonacci(len) {
  var arr = [];
  if (isNaN(len) || len < 0) {
    console.log("输入有误");
  } else {
    for (var i = 0; i < len; i++) {
      if (i === 0 || i === 1) {
        arr[i] = 1;
      } else {
        arr[i] = arr[i - 1] + arr[i - 2];
      }
    }
  }
  return arr;
}

//示例
console.log(fibonacci(10)); //[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

数组类

输出数组中所有的奇数

export function outputOdd(arr) {
  return arr.filter((number) => number % 2 !== 0);
}
//示例
let oddNumbers = outputOdd([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
console.log(oddNumbers); // 输出: [1, 3, 5, 7, 9]

返回一个数组的最大值

export function maxItemOfArray(arr) {
  return Math.max(...arr);
  //   return [...arr].sort((a, b) => b - a).slice(0, 1)[0];
}
//示例
let maxItem = maxItemOfArray([3, 5, 16, 89]);
console.log(maxItem); //89

检查数组的所有项是否相等

export function areAllEqual(arr) {
  return arr.every((item) => item === arr[0]);
}
//示例
let cehek = areAllEqual([3, 3, 3]);
console.log(cehek); //true

移除数组中的 false 值,包括 false,undefined, NaN 和 empty。

export function removeFalseValues(arr) {
  return arr.filter((item) => item);
}
//示例
let arr = removeFalseValues([3, "", false, undefined, NaN]);
console.log(arr); //[3]

移除数组中的重复项

export function removeDuplicatedValues(arr) {
  return [...new Set(arr)];
}
//示例
let arr = removeDuplicatedValues([5, 3, 2, 5, 6, 1, 1, 6]);
console.log(arr); //[5,3,2,6,1]

数组去重(相同对象去重)

export function filterArrById(arr) {
  let obj = {};
  let newArr = arr.reduce((cur, next) => {
    if (next) {
      obj[next.id] ? "" : (obj[next.id] = true && cur.push(next));
    }
    return cur;
  }, []);
  return newArr;
}
//示例
let arr = filterArrById([
  { id: "11", value: 11 },
  { id: "11", value: 11 },
  { id: "22", value: 22 },
  { id: "22", value: 22 },
]);
console.log(arr); //[{ "id": "11", "value": 11 }, { "id": "22", "value": 22 }]

数组任意两个值的和是否等于 k

export function twoNumTotal(arr, k) {
  for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < i; j++) {
      if (arr[i] + arr[j] == k) {
        console.log("两个和有这个k");
        return true;
      }
    }
  }
  console.log("两个和没有这个k");
  return false;
}
//示例
let result = twoNumTotal([1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 44, 55], 6);
console.log(result); //true

数组扁平化

export function flatten(arr) {
  return arr.reduce(
    (prev, item) => prev.concat(Array.isArray(item) ? flatten(item) : item),
    []
  );
  //另一种写法
  //return arr.flat(Infinity);
}
//示例
let arr = flatten([1, [2, 3, [4, 5, 6, [7, 8, 9]]]]);
console.log(arr); //[1, 2, 3, 4, 5, 6, 7, 8, 9]

打乱数组

// 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0
export function randomArray(array = []) {
  return array.sort(() => Math.random() - 0.5);
}

对象类

判断对象的值是不是全为空

export function areAllValuesEmpty(obj) {
  return Object.values(obj).every(
    (value) => value === null || value === undefined || value === ""
  );
}

// 示例用法
const result = areAllValuesEmpty({ a: "", b: null, c: undefined });
console.log(result); // true

判断两个对象(包括数组)是否相等

// 判断两个对象(包括数组)是否相等
export function isObjectEqual(a, b) {
  let aProps = Object.getOwnPropertyNames(a);
  let bProps = Object.getOwnPropertyNames(b);
  if (aProps.length != bProps.length) {
    return false;
  }
  for (let i = 0; i < aProps.length; i++) {
    let propName = aProps[i];
    let propA = a[propName];
    let propB = b[propName];
    if (typeof propA === "object") {
      if (!this.isObjectEqual(propA, propB)) {
        return false;
      }
    } else if (propA !== propB) {
      return false;
    }
  }
  return true;
}

深拷贝, 浅拷贝

/**
 * @param {Object} obj 传过来要克隆的对象
 * @param {Boolean} deep  是否深度克隆
 */
export function clonePlugin(obj, deep) {
  if (Array.isArray(obj)) {
    if (deep) {
      //数组的深克隆;
      var newArr = [];
      for (var i = 0; i < obj.length; i++) {
        newArr.push(clonePlugin(obj[i], deep));
      }
      return newArr;
    } else {
      //判断是否是数组,是数组直接复制数组,返回数组
      return obj.slice();
    }
  } else if (typeof obj === "object") {
    var newObj = {};
    for (var prop in obj) {
      if (deep) {
        //使用递归的方式,遍历的时候进行每一个引用类的值深克隆
        newObj[prop] = clonePlugin(obj[prop], deep);
      } else {
        newObj[prop] = obj[prop];
      }
    }
    return newObj;
  } else {
    // 函数  原始类型
    return obj;
  }
}

其它类

检查给定的字符串是否为有效的 JSON

export function isValidJSON(str) {
  try {
    JSON.parse(str);
    return true;
  } catch (err) {
    return false;
  }
}

// 示例用法
let chech1 = isValidJSON('{'title':"javascript",'price':14}');  //true

页面的底部,而你想要快速滚动到页面顶部

export function scrollToTop() {
  const t = document.documentElement.scrollTop || document.body.scrollTop;
  if (t > 0) {
    window.requestAnimationFrame(scrollToTop);
    window.scrollTo(0, t - t / 8);
  }
}

返回两个日期之间的天数差

export function getDayDiff(date1, date2) {
  return (date1 - date2) / (1000 * 3600 * 24);
}
// 示例用法
let diff = getDayDiff(new Date("2020-04-01"), new Date("2020-08-15")); //136

从日期对象返回字符串时间

export function getTimeFromDate(date) {
  return date.toTimeString().slice(0, 8);
}

// 示例用法
let time = getTimeFromDate(new Date()); //09:46:08

阿拉伯数字转换成大写汉字

export function numberParseChina(money) {
  //汉字的数字
  var cnNums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
  //基本单位
  var cnIntRadice = ["", "拾", "佰", "仟"];
  //对应整数部分扩展单位
  var cnIntUnits = ["", "万", "亿", "兆"];
  //对应小数部分单位
  var cnDecUnits = ["角", "分", "毫", "厘"];
  //整数金额时后面跟的字符
  var cnInteger = "整";
  //整型完以后的单位
  var cnIntLast = "圆";
  //最大处理的数字
  var maxNum = 999999999999999.9999;
  //金额整数部分
  var integerNum;
  //金额小数部分
  var decimalNum;
  //输出的中文金额字符串
  var chineseStr = "";
  //分离金额后用的数组,预定义
  var parts;
  if (money == "") {
    return "";
  }
  money = parseFloat(money);
  if (money >= maxNum) {
    //超出最大处理数字
    return "";
  }
  if (money == 0) {
    chineseStr = cnNums[0] + cnIntLast + cnInteger;
    return chineseStr;
  }
  //转换为字符串
  money = money.toString();
  if (money.indexOf(".") == -1) {
    integerNum = money;
    decimalNum = "";
  } else {
    parts = money.split(".");
    integerNum = parts[0];
    decimalNum = parts[1].substr(0, 4);
  }
  //获取整型部分转换
  if (parseInt(integerNum, 10) > 0) {
    var zeroCount = 0;
    var IntLen = integerNum.length;
    for (var i = 0; i < IntLen; i++) {
      var n = integerNum.substr(i, 1);
      var p = IntLen - i - 1;
      var q = p / 4;
      var m = p % 4;
      if (n == "0") {
        zeroCount++;
      } else {
        if (zeroCount > 0) {
          chineseStr += cnNums[0];
        }
        //归零
        zeroCount = 0;
        chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
      }
      if (m == 0 && zeroCount < 4) {
        chineseStr += cnIntUnits[q];
      }
    }
    chineseStr += cnIntLast;
  }
  //小数部分
  if (decimalNum != "") {
    var decLen = decimalNum.length;
    for (var i = 0; i < decLen; i++) {
      var n = decimalNum.substr(i, 1);
      if (n != "0") {
        chineseStr += cnNums[Number(n)] + cnDecUnits[i];
      }
    }
  }
  if (chineseStr == "") {
    chineseStr += cnNums[0] + cnIntLast + cnInteger;
  } else if (decimalNum == "") {
    chineseStr += cnInteger;
  }
  return chineseStr;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值