@tanwan/utils 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/array/chunk.cjs +1 -1
- package/dist/array/chunk.d.cts +1 -1
- package/dist/array/chunk.d.ts +1 -1
- package/dist/array/chunk.js +1 -1
- package/dist/array/chunk.js.map +1 -1
- package/dist/array/flatten.cjs +1 -1
- package/dist/array/flatten.d.cts +1 -1
- package/dist/array/flatten.d.ts +1 -1
- package/dist/array/flatten.js +1 -1
- package/dist/array/flatten.js.map +1 -1
- package/dist/array/groupBy.cjs +36 -0
- package/dist/array/groupBy.d.cts +27 -0
- package/dist/array/groupBy.d.cts.map +1 -0
- package/dist/array/groupBy.d.ts +28 -0
- package/dist/array/groupBy.d.ts.map +1 -0
- package/dist/array/groupBy.js +38 -0
- package/dist/array/groupBy.js.map +1 -0
- package/dist/array/range.cjs +27 -0
- package/dist/array/range.d.cts +21 -0
- package/dist/array/range.d.cts.map +1 -0
- package/dist/array/range.d.ts +22 -0
- package/dist/array/range.d.ts.map +1 -0
- package/dist/array/range.js +29 -0
- package/dist/array/range.js.map +1 -0
- package/dist/array/shuffle.cjs +1 -1
- package/dist/array/shuffle.d.cts +1 -1
- package/dist/array/shuffle.d.ts +1 -1
- package/dist/array/shuffle.js +1 -1
- package/dist/array/shuffle.js.map +1 -1
- package/dist/array/unique.cjs +1 -1
- package/dist/array/unique.d.cts +1 -1
- package/dist/array/unique.d.ts +1 -1
- package/dist/array/unique.js +1 -1
- package/dist/array/unique.js.map +1 -1
- package/dist/base/deepClone.cjs +1 -1
- package/dist/base/deepClone.d.cts +1 -1
- package/dist/base/deepClone.d.ts +1 -1
- package/dist/base/deepClone.js +1 -1
- package/dist/base/deepClone.js.map +1 -1
- package/dist/base/isArray.cjs +1 -1
- package/dist/base/isArray.d.cts +1 -1
- package/dist/base/isArray.d.ts +1 -1
- package/dist/base/isArray.js +1 -1
- package/dist/base/isArray.js.map +1 -1
- package/dist/base/isEmpty.cjs +42 -0
- package/dist/base/isEmpty.d.cts +34 -0
- package/dist/base/isEmpty.d.cts.map +1 -0
- package/dist/base/isEmpty.d.ts +35 -0
- package/dist/base/isEmpty.d.ts.map +1 -0
- package/dist/base/isEmpty.js +44 -0
- package/dist/base/isEmpty.js.map +1 -0
- package/dist/base/isObject.cjs +1 -1
- package/dist/base/isObject.d.cts +1 -1
- package/dist/base/isObject.d.ts +1 -1
- package/dist/base/isObject.js +1 -1
- package/dist/base/isObject.js.map +1 -1
- package/dist/base/isString.cjs +1 -1
- package/dist/base/isString.d.cts +1 -1
- package/dist/base/isString.d.ts +1 -1
- package/dist/base/isString.js +1 -1
- package/dist/base/isString.js.map +1 -1
- package/dist/date/formatDate.cjs +1 -1
- package/dist/date/formatDate.d.cts +1 -1
- package/dist/date/formatDate.d.ts +1 -1
- package/dist/date/formatDate.js +1 -1
- package/dist/date/formatDate.js.map +1 -1
- package/dist/date/getRelativeTime.cjs +1 -1
- package/dist/date/getRelativeTime.d.cts +1 -1
- package/dist/date/getRelativeTime.d.ts +1 -1
- package/dist/date/getRelativeTime.js +1 -1
- package/dist/date/getRelativeTime.js.map +1 -1
- package/dist/function/debounce.cjs +1 -1
- package/dist/function/debounce.d.cts +1 -1
- package/dist/function/debounce.d.ts +1 -1
- package/dist/function/debounce.js +1 -1
- package/dist/function/debounce.js.map +1 -1
- package/dist/function/delay.cjs +8 -0
- package/dist/function/delay.d.cts +19 -0
- package/dist/function/delay.d.cts.map +1 -0
- package/dist/function/delay.d.ts +20 -0
- package/dist/function/delay.d.ts.map +1 -0
- package/dist/function/delay.js +10 -0
- package/dist/function/delay.js.map +1 -0
- package/dist/function/throttle.cjs +1 -1
- package/dist/function/throttle.d.cts +1 -1
- package/dist/function/throttle.d.ts +1 -1
- package/dist/function/throttle.js +1 -1
- package/dist/function/throttle.js.map +1 -1
- package/dist/index.cjs +18 -0
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.iife.js +1 -1
- package/dist/index.js +10 -1
- package/dist/number/clamp.cjs +1 -1
- package/dist/number/clamp.d.cts +1 -1
- package/dist/number/clamp.d.ts +1 -1
- package/dist/number/clamp.js +1 -1
- package/dist/number/clamp.js.map +1 -1
- package/dist/number/formatThousands.cjs +1 -1
- package/dist/number/formatThousands.d.cts +1 -1
- package/dist/number/formatThousands.d.ts +1 -1
- package/dist/number/formatThousands.js +1 -1
- package/dist/number/formatThousands.js.map +1 -1
- package/dist/number/randomInt.cjs +1 -1
- package/dist/number/randomInt.d.cts +1 -1
- package/dist/number/randomInt.d.ts +1 -1
- package/dist/number/randomInt.js +1 -1
- package/dist/number/randomInt.js.map +1 -1
- package/dist/object/omit.cjs +23 -0
- package/dist/object/omit.d.cts +18 -0
- package/dist/object/omit.d.cts.map +1 -0
- package/dist/object/omit.d.ts +19 -0
- package/dist/object/omit.d.ts.map +1 -0
- package/dist/object/omit.js +25 -0
- package/dist/object/omit.js.map +1 -0
- package/dist/object/pick.cjs +22 -0
- package/dist/object/pick.d.cts +18 -0
- package/dist/object/pick.d.cts.map +1 -0
- package/dist/object/pick.d.ts +19 -0
- package/dist/object/pick.d.ts.map +1 -0
- package/dist/object/pick.js +24 -0
- package/dist/object/pick.js.map +1 -0
- package/dist/string/camelCase.cjs +0 -1
- package/dist/string/camelCase.js +0 -1
- package/dist/string/camelCase.js.map +1 -1
- package/dist/string/capitalize.cjs +1 -1
- package/dist/string/capitalize.d.cts +1 -1
- package/dist/string/capitalize.d.ts +1 -1
- package/dist/string/capitalize.js +1 -1
- package/dist/string/capitalize.js.map +1 -1
- package/dist/string/uuid.cjs +23 -0
- package/dist/string/uuid.d.cts +17 -0
- package/dist/string/uuid.d.cts.map +1 -0
- package/dist/string/uuid.d.ts +18 -0
- package/dist/string/uuid.d.ts.map +1 -0
- package/dist/string/uuid.js +25 -0
- package/dist/string/uuid.js.map +1 -0
- package/dist/url/parseQueryString.cjs +48 -0
- package/dist/url/parseQueryString.d.cts +22 -0
- package/dist/url/parseQueryString.d.cts.map +1 -0
- package/dist/url/parseQueryString.d.ts +23 -0
- package/dist/url/parseQueryString.d.ts.map +1 -0
- package/dist/url/parseQueryString.js +50 -0
- package/dist/url/parseQueryString.js.map +1 -0
- package/dist/url/stringifyQueryString.cjs +38 -0
- package/dist/url/stringifyQueryString.d.cts +22 -0
- package/dist/url/stringifyQueryString.d.cts.map +1 -0
- package/dist/url/stringifyQueryString.d.ts +23 -0
- package/dist/url/stringifyQueryString.d.ts.map +1 -0
- package/dist/url/stringifyQueryString.js +40 -0
- package/dist/url/stringifyQueryString.js.map +1 -0
- package/package.json +39 -3
package/dist/array/chunk.cjs
CHANGED
package/dist/array/chunk.d.cts
CHANGED
package/dist/array/chunk.d.ts
CHANGED
package/dist/array/chunk.js
CHANGED
package/dist/array/chunk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.js","names":[],"sources":["../../src/array/chunk/index.ts"],"sourcesContent":["/**\n * 数组分块\n * @example\n * ```ts\n * import chunk from '@
|
|
1
|
+
{"version":3,"file":"chunk.js","names":[],"sources":["../../src/array/chunk/index.ts"],"sourcesContent":["/**\n * 数组分块\n * @example\n * ```ts\n * import chunk from '@tanwan/utils/chunk'\n * chunk([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]\n * chunk(['a', 'b', 'c'], 1) // [['a'], ['b'], ['c']]\n * ```\n */\nexport default function chunk<T>(arr: T[], size: number): T[][] {\n const result: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,MAAS,KAAU,MAAqB;CAC9D,MAAM,SAAgB,EAAE;AACxB,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,KACnC,QAAO,KAAK,IAAI,MAAM,GAAG,IAAI,KAAK,CAAC;AAErC,QAAO"}
|
package/dist/array/flatten.cjs
CHANGED
package/dist/array/flatten.d.cts
CHANGED
package/dist/array/flatten.d.ts
CHANGED
package/dist/array/flatten.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flatten.js","names":[],"sources":["../../src/array/flatten/index.ts"],"sourcesContent":["/**\n * 数组扁平化\n * @example\n * ```ts\n * import flatten from '@
|
|
1
|
+
{"version":3,"file":"flatten.js","names":[],"sources":["../../src/array/flatten/index.ts"],"sourcesContent":["/**\n * 数组扁平化\n * @example\n * ```ts\n * import flatten from '@tanwan/utils/flatten'\n * flatten([1, [2, [3, 4]]]) // [1, 2, 3, 4]\n * flatten([1, [2, 3]], 1) // [1, 2, 3]\n * ```\n */\nexport default function flatten<T>(arr: unknown[], depth: number = Infinity): T[] {\n if (depth === 0) return arr as T[];\n const result: T[] = [];\n for (const item of arr) {\n if (Array.isArray(item) && depth > 0) {\n result.push(...flatten<T>(item, depth - 1));\n } else {\n result.push(item as T);\n }\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,QAAW,KAAgB,QAAgB,UAAe;AAChF,KAAI,UAAU,EAAG,QAAO;CACxB,MAAM,SAAc,EAAE;AACtB,MAAK,MAAM,QAAQ,IACjB,KAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,EACjC,QAAO,KAAK,GAAG,QAAW,MAAM,QAAQ,EAAE,CAAC;KAE3C,QAAO,KAAK,KAAU;AAG1B,QAAO"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//#region src/array/groupBy/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* 根据指定的 key 或迭代函数对数组进行分组
|
|
4
|
+
*
|
|
5
|
+
* @param arr - 待分组的数组
|
|
6
|
+
* @param iteratee - 分组依据:可以是属性名或返回分组 key 的函数
|
|
7
|
+
* @returns 分组后的对象
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import groupBy from '@tanwan/utils/groupBy'
|
|
12
|
+
* // 按属性名分组
|
|
13
|
+
* groupBy([{ type: 'a', val: 1 }, { type: 'b', val: 2 }, { type: 'a', val: 3 }], 'type')
|
|
14
|
+
* // { a: [{ type: 'a', val: 1 }, { type: 'a', val: 3 }], b: [{ type: 'b', val: 2 }] }
|
|
15
|
+
*
|
|
16
|
+
* // 按函数分组
|
|
17
|
+
* groupBy([1.2, 2.3, 3.4], Math.floor)
|
|
18
|
+
* // { 1: [1.2], 2: [2.3], 3: [3.4] }
|
|
19
|
+
*
|
|
20
|
+
* // 按条件分组
|
|
21
|
+
* groupBy([1, 2, 3, 4, 5], (n) => (n % 2 === 0 ? 'even' : 'odd'))
|
|
22
|
+
* // { even: [2, 4], odd: [1, 3, 5] }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function groupBy(arr, iteratee) {
|
|
26
|
+
const result = {};
|
|
27
|
+
const getKey = typeof iteratee === "function" ? iteratee : (item) => String(item[iteratee]);
|
|
28
|
+
for (const item of arr) {
|
|
29
|
+
const key = String(getKey(item));
|
|
30
|
+
if (!result[key]) result[key] = [];
|
|
31
|
+
result[key].push(item);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
module.exports = groupBy;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/array/groupBy/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 根据指定的 key 或迭代函数对数组进行分组
|
|
4
|
+
*
|
|
5
|
+
* @param arr - 待分组的数组
|
|
6
|
+
* @param iteratee - 分组依据:可以是属性名或返回分组 key 的函数
|
|
7
|
+
* @returns 分组后的对象
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import groupBy from '@tanwan/utils/groupBy'
|
|
12
|
+
* // 按属性名分组
|
|
13
|
+
* groupBy([{ type: 'a', val: 1 }, { type: 'b', val: 2 }, { type: 'a', val: 3 }], 'type')
|
|
14
|
+
* // { a: [{ type: 'a', val: 1 }, { type: 'a', val: 3 }], b: [{ type: 'b', val: 2 }] }
|
|
15
|
+
*
|
|
16
|
+
* // 按函数分组
|
|
17
|
+
* groupBy([1.2, 2.3, 3.4], Math.floor)
|
|
18
|
+
* // { 1: [1.2], 2: [2.3], 3: [3.4] }
|
|
19
|
+
*
|
|
20
|
+
* // 按条件分组
|
|
21
|
+
* groupBy([1, 2, 3, 4, 5], (n) => (n % 2 === 0 ? 'even' : 'odd'))
|
|
22
|
+
* // { even: [2, 4], odd: [1, 3, 5] }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
declare function groupBy<T>(arr: T[], iteratee: keyof T | ((item: T) => string | number)): Record<string, T[]>;
|
|
26
|
+
export = groupBy;
|
|
27
|
+
//# sourceMappingURL=groupBy.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupBy.d.cts","names":[],"sources":["../../src/array/groupBy/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;iBAuBwB,OAAA,GAAA,CAAW,GAAA,EAAK,CAAA,IAAK,QAAA,QAAgB,CAAA,KAAM,IAAA,EAAM,CAAA,wBAAyB,MAAA,SAAe,CAAA;AAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/array/groupBy/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 根据指定的 key 或迭代函数对数组进行分组
|
|
4
|
+
*
|
|
5
|
+
* @param arr - 待分组的数组
|
|
6
|
+
* @param iteratee - 分组依据:可以是属性名或返回分组 key 的函数
|
|
7
|
+
* @returns 分组后的对象
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import groupBy from '@tanwan/utils/groupBy'
|
|
12
|
+
* // 按属性名分组
|
|
13
|
+
* groupBy([{ type: 'a', val: 1 }, { type: 'b', val: 2 }, { type: 'a', val: 3 }], 'type')
|
|
14
|
+
* // { a: [{ type: 'a', val: 1 }, { type: 'a', val: 3 }], b: [{ type: 'b', val: 2 }] }
|
|
15
|
+
*
|
|
16
|
+
* // 按函数分组
|
|
17
|
+
* groupBy([1.2, 2.3, 3.4], Math.floor)
|
|
18
|
+
* // { 1: [1.2], 2: [2.3], 3: [3.4] }
|
|
19
|
+
*
|
|
20
|
+
* // 按条件分组
|
|
21
|
+
* groupBy([1, 2, 3, 4, 5], (n) => (n % 2 === 0 ? 'even' : 'odd'))
|
|
22
|
+
* // { even: [2, 4], odd: [1, 3, 5] }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
declare function groupBy<T>(arr: T[], iteratee: keyof T | ((item: T) => string | number)): Record<string, T[]>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { groupBy as default };
|
|
28
|
+
//# sourceMappingURL=groupBy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupBy.d.ts","names":[],"sources":["../../src/array/groupBy/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;iBAuBwB,OAAA,GAAA,CAAW,GAAA,EAAK,CAAA,IAAK,QAAA,QAAgB,CAAA,KAAM,IAAA,EAAM,CAAA,wBAAyB,MAAA,SAAe,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/array/groupBy/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* 根据指定的 key 或迭代函数对数组进行分组
|
|
4
|
+
*
|
|
5
|
+
* @param arr - 待分组的数组
|
|
6
|
+
* @param iteratee - 分组依据:可以是属性名或返回分组 key 的函数
|
|
7
|
+
* @returns 分组后的对象
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import groupBy from '@tanwan/utils/groupBy'
|
|
12
|
+
* // 按属性名分组
|
|
13
|
+
* groupBy([{ type: 'a', val: 1 }, { type: 'b', val: 2 }, { type: 'a', val: 3 }], 'type')
|
|
14
|
+
* // { a: [{ type: 'a', val: 1 }, { type: 'a', val: 3 }], b: [{ type: 'b', val: 2 }] }
|
|
15
|
+
*
|
|
16
|
+
* // 按函数分组
|
|
17
|
+
* groupBy([1.2, 2.3, 3.4], Math.floor)
|
|
18
|
+
* // { 1: [1.2], 2: [2.3], 3: [3.4] }
|
|
19
|
+
*
|
|
20
|
+
* // 按条件分组
|
|
21
|
+
* groupBy([1, 2, 3, 4, 5], (n) => (n % 2 === 0 ? 'even' : 'odd'))
|
|
22
|
+
* // { even: [2, 4], odd: [1, 3, 5] }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function groupBy(arr, iteratee) {
|
|
26
|
+
const result = {};
|
|
27
|
+
const getKey = typeof iteratee === "function" ? iteratee : (item) => String(item[iteratee]);
|
|
28
|
+
for (const item of arr) {
|
|
29
|
+
const key = String(getKey(item));
|
|
30
|
+
if (!result[key]) result[key] = [];
|
|
31
|
+
result[key].push(item);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { groupBy as default };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=groupBy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupBy.js","names":[],"sources":["../../src/array/groupBy/index.ts"],"sourcesContent":["/**\n * 根据指定的 key 或迭代函数对数组进行分组\n *\n * @param arr - 待分组的数组\n * @param iteratee - 分组依据:可以是属性名或返回分组 key 的函数\n * @returns 分组后的对象\n *\n * @example\n * ```ts\n * import groupBy from '@tanwan/utils/groupBy'\n * // 按属性名分组\n * groupBy([{ type: 'a', val: 1 }, { type: 'b', val: 2 }, { type: 'a', val: 3 }], 'type')\n * // { a: [{ type: 'a', val: 1 }, { type: 'a', val: 3 }], b: [{ type: 'b', val: 2 }] }\n *\n * // 按函数分组\n * groupBy([1.2, 2.3, 3.4], Math.floor)\n * // { 1: [1.2], 2: [2.3], 3: [3.4] }\n *\n * // 按条件分组\n * groupBy([1, 2, 3, 4, 5], (n) => (n % 2 === 0 ? 'even' : 'odd'))\n * // { even: [2, 4], odd: [1, 3, 5] }\n * ```\n */\nexport default function groupBy<T>(arr: T[], iteratee: keyof T | ((item: T) => string | number)): Record<string, T[]> {\n const result: Record<string, T[]> = {};\n\n const getKey = typeof iteratee === 'function' ? iteratee : (item: T) => String(item[iteratee]);\n\n for (const item of arr) {\n const key = String(getKey(item));\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(item);\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAwB,QAAW,KAAU,UAAyE;CACpH,MAAM,SAA8B,EAAE;CAEtC,MAAM,SAAS,OAAO,aAAa,aAAa,YAAY,SAAY,OAAO,KAAK,UAAU;AAE9F,MAAK,MAAM,QAAQ,KAAK;EACtB,MAAM,MAAM,OAAO,OAAO,KAAK,CAAC;AAChC,MAAI,CAAC,OAAO,KACV,QAAO,OAAO,EAAE;AAElB,SAAO,KAAK,KAAK,KAAK;;AAGxB,QAAO"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/array/range/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* 生成数字序列数组
|
|
4
|
+
*
|
|
5
|
+
* @param start - 起始值(包含)
|
|
6
|
+
* @param end - 结束值(不包含)
|
|
7
|
+
* @param step - 步长,默认为 1
|
|
8
|
+
* @returns 数字序列数组
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import range from '@tanwan/utils/range'
|
|
13
|
+
* range(1, 5) // [1, 2, 3, 4]
|
|
14
|
+
* range(0, 10, 2) // [0, 2, 4, 6, 8]
|
|
15
|
+
* range(5, 0, -1) // [5, 4, 3, 2, 1]
|
|
16
|
+
* range(0, 0) // []
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function range(start, end, step = 1) {
|
|
20
|
+
if (step === 0) throw new Error("step 不能为 0");
|
|
21
|
+
const result = [];
|
|
22
|
+
if (step > 0) for (let i = start; i < end; i += step) result.push(i);
|
|
23
|
+
else for (let i = start; i > end; i += step) result.push(i);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
module.exports = range;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/array/range/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 生成数字序列数组
|
|
4
|
+
*
|
|
5
|
+
* @param start - 起始值(包含)
|
|
6
|
+
* @param end - 结束值(不包含)
|
|
7
|
+
* @param step - 步长,默认为 1
|
|
8
|
+
* @returns 数字序列数组
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import range from '@tanwan/utils/range'
|
|
13
|
+
* range(1, 5) // [1, 2, 3, 4]
|
|
14
|
+
* range(0, 10, 2) // [0, 2, 4, 6, 8]
|
|
15
|
+
* range(5, 0, -1) // [5, 4, 3, 2, 1]
|
|
16
|
+
* range(0, 0) // []
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function range(start: number, end: number, step?: number): number[];
|
|
20
|
+
export = range;
|
|
21
|
+
//# sourceMappingURL=range.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.d.cts","names":[],"sources":["../../src/array/range/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;iBAiBwB,KAAA,CAAM,KAAA,UAAe,GAAA,UAAa,IAAA;AAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/array/range/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 生成数字序列数组
|
|
4
|
+
*
|
|
5
|
+
* @param start - 起始值(包含)
|
|
6
|
+
* @param end - 结束值(不包含)
|
|
7
|
+
* @param step - 步长,默认为 1
|
|
8
|
+
* @returns 数字序列数组
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import range from '@tanwan/utils/range'
|
|
13
|
+
* range(1, 5) // [1, 2, 3, 4]
|
|
14
|
+
* range(0, 10, 2) // [0, 2, 4, 6, 8]
|
|
15
|
+
* range(5, 0, -1) // [5, 4, 3, 2, 1]
|
|
16
|
+
* range(0, 0) // []
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function range(start: number, end: number, step?: number): number[];
|
|
20
|
+
//#endregion
|
|
21
|
+
export { range as default };
|
|
22
|
+
//# sourceMappingURL=range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.d.ts","names":[],"sources":["../../src/array/range/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;iBAiBwB,KAAA,CAAM,KAAA,UAAe,GAAA,UAAa,IAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/array/range/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* 生成数字序列数组
|
|
4
|
+
*
|
|
5
|
+
* @param start - 起始值(包含)
|
|
6
|
+
* @param end - 结束值(不包含)
|
|
7
|
+
* @param step - 步长,默认为 1
|
|
8
|
+
* @returns 数字序列数组
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import range from '@tanwan/utils/range'
|
|
13
|
+
* range(1, 5) // [1, 2, 3, 4]
|
|
14
|
+
* range(0, 10, 2) // [0, 2, 4, 6, 8]
|
|
15
|
+
* range(5, 0, -1) // [5, 4, 3, 2, 1]
|
|
16
|
+
* range(0, 0) // []
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
function range(start, end, step = 1) {
|
|
20
|
+
if (step === 0) throw new Error("step 不能为 0");
|
|
21
|
+
const result = [];
|
|
22
|
+
if (step > 0) for (let i = start; i < end; i += step) result.push(i);
|
|
23
|
+
else for (let i = start; i > end; i += step) result.push(i);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { range as default };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range.js","names":[],"sources":["../../src/array/range/index.ts"],"sourcesContent":["/**\n * 生成数字序列数组\n *\n * @param start - 起始值(包含)\n * @param end - 结束值(不包含)\n * @param step - 步长,默认为 1\n * @returns 数字序列数组\n *\n * @example\n * ```ts\n * import range from '@tanwan/utils/range'\n * range(1, 5) // [1, 2, 3, 4]\n * range(0, 10, 2) // [0, 2, 4, 6, 8]\n * range(5, 0, -1) // [5, 4, 3, 2, 1]\n * range(0, 0) // []\n * ```\n */\nexport default function range(start: number, end: number, step = 1): number[] {\n if (step === 0) {\n throw new Error('step 不能为 0');\n }\n\n const result: number[] = [];\n\n if (step > 0) {\n for (let i = start; i < end; i += step) {\n result.push(i);\n }\n } else {\n for (let i = start; i > end; i += step) {\n result.push(i);\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,SAAwB,MAAM,OAAe,KAAa,OAAO,GAAa;AAC5E,KAAI,SAAS,EACX,OAAM,IAAI,MAAM,aAAa;CAG/B,MAAM,SAAmB,EAAE;AAE3B,KAAI,OAAO,EACT,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK,KAChC,QAAO,KAAK,EAAE;KAGhB,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK,KAChC,QAAO,KAAK,EAAE;AAIlB,QAAO"}
|
package/dist/array/shuffle.cjs
CHANGED
package/dist/array/shuffle.d.cts
CHANGED
package/dist/array/shuffle.d.ts
CHANGED
package/dist/array/shuffle.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shuffle.js","names":[],"sources":["../../src/array/shuffle/index.ts"],"sourcesContent":["/**\n * 数组洗牌(Fisher-Yates 算法)\n * @example\n * ```ts\n * import shuffle from '@
|
|
1
|
+
{"version":3,"file":"shuffle.js","names":[],"sources":["../../src/array/shuffle/index.ts"],"sourcesContent":["/**\n * 数组洗牌(Fisher-Yates 算法)\n * @example\n * ```ts\n * import shuffle from '@tanwan/utils/shuffle'\n * shuffle([1, 2, 3, 4, 5]) // [3, 1, 5, 2, 4](随机)\n * ```\n */\nexport default function shuffle<T>(arr: T[]): T[] {\n const result = [...arr];\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n return result;\n}\n"],"mappings":";;;;;;;;;AAQA,SAAwB,QAAW,KAAe;CAChD,MAAM,SAAS,CAAC,GAAG,IAAI;AACvB,MAAK,IAAI,IAAI,OAAO,SAAS,GAAG,IAAI,GAAG,KAAK;EAC1C,MAAM,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC7C,GAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,IAAI,OAAO,GAAG;;AAEjD,QAAO"}
|
package/dist/array/unique.cjs
CHANGED
package/dist/array/unique.d.cts
CHANGED
package/dist/array/unique.d.ts
CHANGED
package/dist/array/unique.js
CHANGED
package/dist/array/unique.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unique.js","names":[],"sources":["../../src/array/unique/index.ts"],"sourcesContent":["/**\n * 数组去重\n * @example\n * ```ts\n * import unique from '@
|
|
1
|
+
{"version":3,"file":"unique.js","names":[],"sources":["../../src/array/unique/index.ts"],"sourcesContent":["/**\n * 数组去重\n * @example\n * ```ts\n * import unique from '@tanwan/utils/unique'\n * unique([1, 2, 2, 3]) // [1, 2, 3]\n * unique(['a', 'b', 'a']) // ['a', 'b']\n * ```\n */\nexport default function unique<T>(arr: T[]): T[] {\n return [...new Set(arr)];\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,OAAU,KAAe;AAC/C,QAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC"}
|
package/dist/base/deepClone.cjs
CHANGED
|
@@ -4,7 +4,7 @@ const require_base_isObject = require("./isObject.cjs");
|
|
|
4
4
|
* 深拷贝变量
|
|
5
5
|
* @example
|
|
6
6
|
* ```ts
|
|
7
|
-
* import deepClone from '@
|
|
7
|
+
* import deepClone from '@tanwan/utils/deepClone'
|
|
8
8
|
* const obj = { a: 1, b: { c: 2 } }
|
|
9
9
|
* const clone = deepClone(obj)
|
|
10
10
|
* clone.b.c = 3
|
package/dist/base/deepClone.d.ts
CHANGED
package/dist/base/deepClone.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepClone.js","names":[],"sources":["../../src/base/deepClone/index.ts"],"sourcesContent":["import isObject from '../isObject';\n\n/**\n * 深拷贝变量\n * @example\n * ```ts\n * import deepClone from '@
|
|
1
|
+
{"version":3,"file":"deepClone.js","names":[],"sources":["../../src/base/deepClone/index.ts"],"sourcesContent":["import isObject from '../isObject';\n\n/**\n * 深拷贝变量\n * @example\n * ```ts\n * import deepClone from '@tanwan/utils/deepClone'\n * const obj = { a: 1, b: { c: 2 } }\n * const clone = deepClone(obj)\n * clone.b.c = 3\n * obj.b.c // 2(原对象不受影响)\n * ```\n */\nexport default function deepClone<T>(v: T, cache: WeakMap<object, unknown> = new WeakMap<object, unknown>()): T {\n // 基本类型直接返回\n if (v === null || typeof v !== 'object') {\n return v;\n }\n\n // 检测循环引用\n if (cache.has(v as object)) {\n return cache.get(v as object) as T;\n }\n\n if (Array.isArray(v)) {\n const cloned: unknown[] = [];\n cache.set(v as object, cloned);\n for (let i = 0; i < v.length; i++) {\n cloned[i] = deepClone(v[i], cache);\n }\n return cloned as T;\n }\n\n if (v instanceof Date) {\n return new Date(v.getTime()) as T;\n }\n\n if (v instanceof RegExp) {\n return new RegExp(v.source, v.flags) as T;\n }\n\n if (v instanceof Map) {\n const cloned = new Map();\n cache.set(v as object, cloned);\n for (const [key, value] of v) {\n cloned.set(key, deepClone(value, cache));\n }\n return cloned as T;\n }\n\n if (v instanceof Set) {\n const cloned = new Set();\n cache.set(v as object, cloned);\n for (const value of v) {\n cloned.add(deepClone(value, cache));\n }\n return cloned as T;\n }\n\n if (v instanceof WeakMap) {\n throw new Error('Cannot clone WeakMap');\n }\n\n if (v instanceof WeakSet) {\n throw new Error('Cannot clone WeakSet');\n }\n\n if (isObject(v)) {\n const cloned: Record<string, unknown> = {};\n cache.set(v as object, cloned);\n for (const key in v) {\n if (Object.prototype.hasOwnProperty.call(v, key)) {\n cloned[key] = deepClone(v[key], cache);\n }\n }\n return cloned as T;\n }\n\n return v;\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAwB,UAAa,GAAM,wBAAkC,IAAI,SAA0B,EAAK;AAE9G,KAAI,MAAM,QAAQ,OAAO,MAAM,SAC7B,QAAO;AAIT,KAAI,MAAM,IAAI,EAAY,CACxB,QAAO,MAAM,IAAI,EAAY;AAG/B,KAAI,MAAM,QAAQ,EAAE,EAAE;EACpB,MAAM,SAAoB,EAAE;AAC5B,QAAM,IAAI,GAAa,OAAO;AAC9B,OAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,IAC5B,QAAO,KAAK,UAAU,EAAE,IAAI,MAAM;AAEpC,SAAO;;AAGT,KAAI,aAAa,KACf,QAAO,IAAI,KAAK,EAAE,SAAS,CAAC;AAG9B,KAAI,aAAa,OACf,QAAO,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM;AAGtC,KAAI,aAAa,KAAK;EACpB,MAAM,yBAAS,IAAI,KAAK;AACxB,QAAM,IAAI,GAAa,OAAO;AAC9B,OAAK,MAAM,CAAC,KAAK,UAAU,EACzB,QAAO,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC;AAE1C,SAAO;;AAGT,KAAI,aAAa,KAAK;EACpB,MAAM,yBAAS,IAAI,KAAK;AACxB,QAAM,IAAI,GAAa,OAAO;AAC9B,OAAK,MAAM,SAAS,EAClB,QAAO,IAAI,UAAU,OAAO,MAAM,CAAC;AAErC,SAAO;;AAGT,KAAI,aAAa,QACf,OAAM,IAAI,MAAM,uBAAuB;AAGzC,KAAI,aAAa,QACf,OAAM,IAAI,MAAM,uBAAuB;AAGzC,KAAI,SAAS,EAAE,EAAE;EACf,MAAM,SAAkC,EAAE;AAC1C,QAAM,IAAI,GAAa,OAAO;AAC9B,OAAK,MAAM,OAAO,EAChB,KAAI,OAAO,UAAU,eAAe,KAAK,GAAG,IAAI,CAC9C,QAAO,OAAO,UAAU,EAAE,MAAM,MAAM;AAG1C,SAAO;;AAGT,QAAO"}
|
package/dist/base/isArray.cjs
CHANGED
package/dist/base/isArray.d.cts
CHANGED
package/dist/base/isArray.d.ts
CHANGED
package/dist/base/isArray.js
CHANGED
package/dist/base/isArray.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isArray.js","names":[],"sources":["../../src/base/isArray/index.ts"],"sourcesContent":["/**\n * 检测变量是否为数组\n * @example\n * ```ts\n * import isArray from '@
|
|
1
|
+
{"version":3,"file":"isArray.js","names":[],"sources":["../../src/base/isArray/index.ts"],"sourcesContent":["/**\n * 检测变量是否为数组\n * @example\n * ```ts\n * import isArray from '@tanwan/utils/isArray'\n * isArray([1, 2, 3]) // true\n * isArray('hello') // false\n * ```\n */\nexport default function isArray<T>(v: unknown): v is T[] {\n return Array.isArray(v);\n}\n"],"mappings":";;;;;;;;;;AASA,SAAwB,QAAW,GAAsB;AACvD,QAAO,MAAM,QAAQ,EAAE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const require_base_isObject = require("./isObject.cjs");
|
|
2
|
+
//#region src/base/isEmpty/index.ts
|
|
3
|
+
/**
|
|
4
|
+
* 判断值是否为空
|
|
5
|
+
*
|
|
6
|
+
* 以下情况视为空:
|
|
7
|
+
* - `null` / `undefined`
|
|
8
|
+
* - 空字符串 `''`
|
|
9
|
+
* - 空数组 `[]`
|
|
10
|
+
* - 普通空对象 `{}`
|
|
11
|
+
* - 空 `Map` / 空 `Set`
|
|
12
|
+
*
|
|
13
|
+
* 数字 `0`、布尔值 `false` 等视为非空
|
|
14
|
+
*
|
|
15
|
+
* @param value - 待检测的值
|
|
16
|
+
* @returns 是否为空
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import isEmpty from '@tanwan/utils/isEmpty'
|
|
21
|
+
* isEmpty(null) // true
|
|
22
|
+
* isEmpty(undefined) // true
|
|
23
|
+
* isEmpty('') // true
|
|
24
|
+
* isEmpty([]) // true
|
|
25
|
+
* isEmpty({}) // true
|
|
26
|
+
* isEmpty(new Map()) // true
|
|
27
|
+
* isEmpty(new Set()) // true
|
|
28
|
+
* isEmpty(0) // false
|
|
29
|
+
* isEmpty(false) // false
|
|
30
|
+
* isEmpty('hello') // false
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function isEmpty(value) {
|
|
34
|
+
if (value === null || value === void 0) return true;
|
|
35
|
+
if (typeof value === "string") return value.length === 0;
|
|
36
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
37
|
+
if (value instanceof Map || value instanceof Set) return value.size === 0;
|
|
38
|
+
if (require_base_isObject(value)) return Object.keys(value).length === 0;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
module.exports = isEmpty;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/base/isEmpty/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 判断值是否为空
|
|
4
|
+
*
|
|
5
|
+
* 以下情况视为空:
|
|
6
|
+
* - `null` / `undefined`
|
|
7
|
+
* - 空字符串 `''`
|
|
8
|
+
* - 空数组 `[]`
|
|
9
|
+
* - 普通空对象 `{}`
|
|
10
|
+
* - 空 `Map` / 空 `Set`
|
|
11
|
+
*
|
|
12
|
+
* 数字 `0`、布尔值 `false` 等视为非空
|
|
13
|
+
*
|
|
14
|
+
* @param value - 待检测的值
|
|
15
|
+
* @returns 是否为空
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import isEmpty from '@tanwan/utils/isEmpty'
|
|
20
|
+
* isEmpty(null) // true
|
|
21
|
+
* isEmpty(undefined) // true
|
|
22
|
+
* isEmpty('') // true
|
|
23
|
+
* isEmpty([]) // true
|
|
24
|
+
* isEmpty({}) // true
|
|
25
|
+
* isEmpty(new Map()) // true
|
|
26
|
+
* isEmpty(new Set()) // true
|
|
27
|
+
* isEmpty(0) // false
|
|
28
|
+
* isEmpty(false) // false
|
|
29
|
+
* isEmpty('hello') // false
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare function isEmpty(value: unknown): boolean;
|
|
33
|
+
export = isEmpty;
|
|
34
|
+
//# sourceMappingURL=isEmpty.d.cts.map
|