UNPKG

js-utils-chs

Version:

自定义工具函数库

443 lines (403 loc) 12.3 kB
// 数据原生方法 /** * 数组截取 * @param {*} arr * @param {*} start 开始截取索引 * @param {*} end 结束索引 * @returns */ export function substring(arr, start, end) { if (!Array.isArray(arr)) return []; if (typeof start !== 'number') start = Number(start); if (typeof end !== 'number') end = Number(end); if (isNaN(start)) start = 0; if (isNaN(end)) end = arr.length; return arr.substring(start, end) } /** * 数组截取 * @param {*} arr * @param {*} start 开始截取索引 * @param {*} end 结束索引 * @returns */ export function substr(arr, start, end) { if (!Array.isArray(arr)) return []; if (typeof start !== 'number') start = Number(start); if (typeof end !== 'number') end = Number(end); if (isNaN(start)) start = 0; if (isNaN(end)) end = arr.length; return arr.substr(start, end) } /** * 数组添加元素 * @param {Array} arr 数组 * @param {...any} element 要添加的元素 * @returns */ export function push(arr, ...element) { if (!Array.isArray(arr)) return arr; return arr.push(...element); } /** * 从后面删除元素,只能是一个,返回值是删除的元素 * @param {Array} arr * @returns */ export function pop(arr) { if (!Array.isArray(arr)) return arr; return arr.pop(); } /** * 从前面删除元素,只能是一个,返回值是删除的元素 * @param {Array} arr * @returns */ export function shift(arr) { if (!Array.isArray(arr)) return arr; return arr.shift(); } /** * 从前面添加元素,添加一个或多个,返回值是添加完后的数组的长度 * @param {Array} arr * @param {...any} element * @returns */ export function unshift(arr, ...element) { if (!Array.isArray(arr)) return arr; return arr.unshift(...element) } /** * 删除从 index(索引值)开始之后的那 num(默认到数组的结束位置)个元素,返回值是删除的元素数组 * @param {Array} arr * @param {Number} index * @param {Number} num * @param {...any} element * @returns */ export function splice(arr, index, num, ...element) { if (!Array.isArray(arr)) return arr; if (typeof index !== 'number') index = Number(index); if (typeof num !== 'number') num = Number(num); if (isNaN(index) || isNaN(num)) return arr; // 添加元素 if (element.length > 0) { return arr.splice(index, num, [...element]) } // 删除元素 return arr.splice(index, num) } /** * 将字符串转化为数组 * @param {Array} arr * @param {String} str * @returns */ export function split(arr, str = '') { return arr.split(str) } /** * 连接两个数组,返回值是连接后的新数组 * @param {Array} arr1 * @param {Array} arr2 * @returns */ export function concat(arr1, arr2) { if (!Array.isArray(arr1) || !Array.isArray(arr2)) return arr1; return arr1.concat(arr2); } /** * 将数组进行排序,返回值是排好的数组,默认是按照最左边的数字进行排序(非数字整体大小) * @param {Array} arr * @param {Function} fn * @returns */ export function sort(arr, fn) { if (!Array.isArray(arr)) return arr if (typeof fn !== 'function') { return arr.sort(); } return arr.sort(fn); } /** * 将原数组反转,返回值是反转后的数组 * @param {Array} arr * @returns */ export function reverse(arr) { if (!Array.isArray(arr)) return arr return arr.reverse(); } /** * 切去索引值start到索引值end(不包含end的值)的数组,返回值是切出去的数组 * @param {Array} arr * @param {Number} start * @param {Number} end * @returns */ export function slice(arr, start, end) { if (!Array.isArray(arr)) return arr; if (typeof start !== 'number') start = Number(start); if (typeof end !== 'number') end = Number(end); if (isNaN(start)) start = 0; if (isNaN(end)) end = arr.length; return arr.slice(start, end); } /** * 遍历数组,无返回值 * @param {Array} arr * @param {Function} fn */ export function forEach(arr, fn) { if (!Array.isArray(arr)) return arr; arr.forEach((item, index) => { typeof fn === 'function' && fn(item, index) }) } /** * 遍历数组(对原数组的值进行操作),返回一个新数组 * @param {Array} arr * @param {Function} fn * @returns */ export function mapArray(arr, fn) { if (!Array.isArray(arr)) return arr; return arr.map((value, index, array) => { return typeof fn === "function" ? fn(value, index, array) : index >= 0 }) } /** * 过滤数组,返回一个满足要求的数组 * @param {Array} arr * @param {Function} fn * @returns */ export function filter(arr, fn) { if (!Array.isArray(arr)) return arr; return arr.filter((value, index) => { return typeof fn === "function" ? fn(value, index) : index >= 0 }) } /** * 根据判断条件,遍历数组中的元素,是否都满足,若都满足则返回true,反之返回false * @param {Array} arr * @param {Function} fn * @returns */ export function every(arr, fn) { if (!Array.isArray(arr)) return arr; return arr.every((value, index) => { return typeof fn === "function" ? fn(value, index) : index >= 0 }) } /** * 根据判断条件,遍历数组中的元素,是否存在至少有一个满足,若存在则返回true,反之返回false * @param {Array} arr * @param {Function} fn * @returns */ export function some(arr, fn) { if (!Array.isArray(arr)) return arr; return arr.some((value, index) => { return typeof fn === "function" ? fn(value, index) : index >= 0 }) } /** * 从前往后查找某个元素的索引值,若有重复的,则返回第一个查到的索引值,若不存在,返回 -1 * @param {Array} arr * @param {any} value * @returns */ export function indexOf(arr, value) { if (!value) return -1; return arr.indexOf(value); } /** * 从后往前查找某个元素的索引值,若有重复的,则返回第一个查到的索引值,若不存在,返回 -1 * @param {Array} arr * @param {any} value * @returns */ export function lastIndexOf(arr, value) { if (!value) return -1; return arr.lastIndexOf(value) } /** * 将伪数组变成数组,只要有length的就可以转成数组 * @param {Object} arr * @returns */ export function from(arr) { if (!arr.hasOwnProperty('length')) return arr return Array.from(arr); } /** * 将一组值转换成数组,类似于声明数组 * @param {any} value * @returns */ export function of(value) { if (!value) return []; return Array.of(value); } /** * 找到第一个符合条件的数组成员 * @param {Array} arr * @param {Function} fn * @returns */ export function find(arr, fn) { if (!Array.isArray(arr)) return arr; return arr.find((value, index, array) => { return typeof fn === "function" ? fn(value, index, array) : index >= 0 }) } /** * 找到第一个符合条件的数组成员的索引值 * @param {Array} arr * @param {Function} fn * @returns */ export function findIndex(arr, fn) { if (!Array.isArray(arr)) return arr; return arr.findIndex((value, index, array) => { return typeof fn === "function" ? fn(value, index, array) : index >= 0 }) } /** * 判断数组中是否包含特定的值 * @param {Array} arr * @param {Any} value * @returns */ export function includes(arr, value) { if (!Array.isArray(arr) || !value) return false; return arr.includes(value) } /** * 使用给定的值,填充一个数组(改变原数组) * @param {*} arr * @param {*} target 待填充的元素 * @param {*} start 开始填充的位置 - 索引 * @param {*} end 终止填充的位置 - 索引(不包括该位置) * @returns */ export function fill(arr, target, start, end) { if (!Array.isArray(arr) || !target) return arr if (typeof start !== 'number') start = Number(start) if (typeof end !== 'number') end = Number(end) if (isNaN(start)) start = 0 if (isNaN(end)) end = arr.length return arr.fill(target, start, end) } /** * 遍历数组的键名 * @param {Array} arr * @returns */ export function Keys(arr) { if (!Array.isArray(arr)) return [] return arr.Keys(); } /** * 遍历数组键值 * @param {Array} arr * @returns */ export function values(arr) { if (!Array.isArray(arr)) return [] return arr.values() } /** * 遍历数组的键名和键值 * @param {Array} arr * @returns */ export function entries(arr) { if (!Array.isArray(arr)) return [] return arr.entries() } /** * 在当前数组内部,将制定位置的数组复制到其他位置,会覆盖原数组项,返回当前数组 * @param {Array} arr * @param {Number} target 必选 索引从该位置开始替换数组项 * @param {Number} start 可选 索引从该位置开始读取数组项,默认为0.如果为负值,则从右往左读。 * @param {Number} end 可选 索引到该位置停止读取的数组项,默认是Array.length,如果是负值,表示倒数 * @returns */ export function copyWithin(arr, target, start, end) { if (!Array.isArray(arr) || typeof target !== 'number') return [] if (typeof start !== 'number') start = Number(start) if (typeof end !== 'number') end = Number(end) if (isNaN(start)) start = 0 if (isNaN(end)) end = arr.length return arr.copyWithin(target, start, end) } /** * 判断一个值是否为数组的方法,若为数组,返回true,反之返回false * @param {Array} arr * @returns */ export function isArray(arr) { return Array.isArray(arr) } /** * 把数组中的所有元素放入一个字符串,separate表示分隔符,可省略,默认是逗号 * @param {Array} arr * @param {String} str * @returns */ export function join(arr, str) { if (!Array.isArray(arr)) return ''; if (str === null || str == undefined) return arr.join(); return arr.join(str) } /** * 对数组内嵌套的数组“拉平”,就是把数组中的数组的元素挨个拿出来,放数组元素所在位置,返回一个新的数组,不会影响到原来的数组 * @param {Array} arr * @param {Number} pliy pliy表示拉平的层数,默认是1层,想无限拉平可以传入Infinity关键字 * @returns */ export function flat(arr, pliy = 1) { if (!Array.isArray(arr)) return []; return arr.flat(pliy); } /** * 对原数组的每个成员执行一个函数,相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。只能展开一层数组 * arr.flatMap((x) => [x, x * 2]) // [2, 4, 3, 6, 4, 8] * @param {Array} arr * @param {Function} fn * @returns */ export function flatMap(arr, fn) { if (!Array.isArray(arr)) return []; return arr.flatMap((x) => { return typeof fn === 'function' ? fn(x) : [x, x * 2] }) } /** * 将数组转换为字符串并返回。数组中的元素之间用逗号分隔。 * @param {Array} arr * @returns */ export function toString(arr) { if (!Array.isArray(arr)) return ''; return arr.toString() } /** * 对数组中的每个元素执行一个提供的函数(升序执行),将其结果汇总为单个返回值。 * 接收4个参数: * Accumulator (acc) (累计器) * Current Value (cur) (当前值) * Current Index (idx) (当前索引) * Source Array (src) (源数组) * @param {Array} arr * @param {Function} fn * @returns */ export function reduce(arr, fn) { if (!Array.isArray(arr)) return ''; return arr.reduce((acc, value, index, array) => { return typeof fn === 'function' ? fn(acc, value, index, array) : acc + value }) }