typescript-util
Version:
JS/TS 的简单工具
119 lines • 3.29 kB
JavaScript
import { ObjectTool } from './ObjectTool';
import { TreeTool } from './TreeTool';
/**
* 数据工具
* @author 冰凝
* @date 2022年9月19日 09点50分
**/
export class ArrayTool {
static treePath = TreeTool.treePath;
static treeEach = TreeTool.treeEach;
static buildTree = TreeTool.buildTree;
/**
* 数组是空哒?
* @param {any[]} arr 待检查数组
* @return {boolean} ?
*/
static isEmpty(arr) {
if (ObjectTool.isNull(arr)) {
return true;
}
if (!Array.isArray(arr)) {
return true;
}
return arr.length === 0;
}
/**
* 数组非空?
* @param {any[]} arr 待检查数组
* @return {boolean} ?
*/
static isNotEmpty(arr) {
return !this.isEmpty(arr);
}
// noinspection JSValidateJSDoc
/**
* 分组
* @param {S[]} arr 源数据
* @param {(i: S) => string} keyFun Key 映射
* @return {Record<string, S[]>}
*/
static groupBy(arr, keyFun) {
if (this.isEmpty(arr)) {
return {};
}
ObjectTool.requireNotNull(keyFun);
return arr?.reduce((pv, cv) => {
const key = keyFun(cv);
// @ts-ignore
if (this.isEmpty(pv[key])) {
// @ts-ignore
pv[key] = [cv];
}
else {
// @ts-ignore
pv[key].push(cv);
}
return pv;
}, {});
}
/**
* 去重
* @param sourceArr 源数组
* @param notNull 是否保留空值, 默认不保留(true)
*/
static distinct(sourceArr, notNull = true) {
if (ArrayTool.isEmpty(sourceArr)) {
return [];
}
return Array.from(new Set(notNull ? sourceArr?.filter(i => ObjectTool.isNotNull(i)) : sourceArr));
}
/**
* 数组 转 Map (对象)
* 如果 keyFun 返回值(最终key)相同, 按照源数组顺序覆盖
* @para arr 源数组
* @param arr
* @param keyFun key 映射
* @param valueFun value 映射 可选, 默认 为: S => S
* @return 结果
*/
static toMap(arr, keyFun, valueFun) {
if (this.isEmpty(arr)) {
return {};
}
ObjectTool.requireNotNull(keyFun);
return arr.reduce((pv, cv) => {
// @ts-ignore
pv[keyFun(cv)] = ObjectTool.requireNotNullDefault(valueFun, ((i) => i))(cv);
return pv;
}, {});
}
/**
* 嵌套数组展开
* <p>
* 例:
* <pre>
* const arr = [
* {items: [1, 2, 3]},
* {items: [4, 5, 6]},
* ]
*
* // res: [1, 2, 3, 4, 5, 6]
* const res = CollUtil.flatMap(arr, i => i.items)
* </pre>
* @param arr 源数组
* @param map 源数组映射, 结果为数组类型
* @return map 数组合并后的结构
* @deprecated 使用 {@link Array.flatMap()}替代
*/
static flatMap(arr, map) {
if (this.isEmpty(arr)) {
return [];
}
ObjectTool.requireNotNull(map);
return arr.map(map)
.filter(i => this.isNotEmpty(i))
.reduce((pv, cv) => ([...pv, ...cv]), []);
}
}
//# sourceMappingURL=ArrayTool.js.map