arayts
Version:
让 TypeScript 开发如丝般顺滑。ArayTS 提供了一套高效、优雅的算法工具集,包含常用的数据结构与算法实现,帮助开发者轻松构建可靠的应用程序。
444 lines (443 loc) • 14.9 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils = /** @class */ (function () {
function ArrayUtils() {
}
/**
* 数组去重
*/
ArrayUtils.unique = function (arr) {
return Array.from(new Set(arr));
};
/**
* 数组扁平化
*/
ArrayUtils.flatten = function (arr) {
return arr.reduce(function (flat, toFlat) {
return flat.concat(Array.isArray(toFlat) ? ArrayUtils.flatten(toFlat) : toFlat);
}, []);
};
/**
* 数组分组
*/
ArrayUtils.groupBy = function (arr, key) {
return arr.reduce(function (groups, item) {
var groupKey = String(item[key]);
groups[groupKey] = groups[groupKey] || [];
groups[groupKey].push(item);
return groups;
}, {});
};
/**
* 数组排序(支持多字段)
*/
ArrayUtils.sortBy = function (arr) {
var keys = [];
for (var _i = 1; _i < arguments.length; _i++) {
keys[_i - 1] = arguments[_i];
}
return __spreadArray([], arr, true).sort(function (a, b) {
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
var key = keys_1[_i];
if (a[key] < b[key])
return -1;
if (a[key] > b[key])
return 1;
}
return 0;
});
};
/**
* 数组交集
*/
ArrayUtils.intersection = function () {
var arrays = [];
for (var _i = 0; _i < arguments.length; _i++) {
arrays[_i] = arguments[_i];
}
return arrays.reduce(function (a, b) { return a.filter(function (c) { return b.includes(c); }); });
};
/**
* 数组差集
*/
ArrayUtils.difference = function (arr1, arr2) {
return arr1.filter(function (x) { return !arr2.includes(x); });
};
/**
* 数组分块
*/
ArrayUtils.chunk = function (arr, size) {
return Array.from({ length: Math.ceil(arr.length / size) }, function (_, i) {
return arr.slice(i * size, i * size + size);
});
};
/**
* 移除数组中的假值
*/
ArrayUtils.compact = function (arr) {
return arr.filter(Boolean);
};
/**
* 获取数组中指定属性的值
*/
ArrayUtils.pluck = function (arr, key) {
return arr.map(function (item) { return item[key]; });
};
/**
* 数组随机打乱
*/
ArrayUtils.shuffle = function (arr) {
var _a;
var result = __spreadArray([], arr, true);
for (var i = result.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
_a = [result[j], result[i]], result[i] = _a[0], result[j] = _a[1];
}
return result;
};
/**
* 数组去重并按照指定字段排序
*/
ArrayUtils.uniqueAndSort = function (arr, key) {
// 使用 Map 来存储唯一项
var uniqueMap = new Map();
// 遍历数组,将每个项按照指定的 key 存储
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
var item = arr_1[_i];
var keyValue = item[key];
if (!uniqueMap.has(keyValue)) {
uniqueMap.set(keyValue, item);
}
}
// 转换为数组并排序
return Array.from(uniqueMap.values()).sort(function (a, b) {
if (a[key] < b[key])
return -1;
if (a[key] > b[key])
return 1;
return 0;
});
};
/**
* 查找数组中出现次数最多的元素
*/
ArrayUtils.mostFrequent = function (arr) {
if (arr.length === 0)
return null;
var frequency = arr.reduce(function (acc, curr) {
acc[String(curr)] = (acc[String(curr)] || 0) + 1;
return acc;
}, {});
var maxFreq = Math.max.apply(Math, Object.values(frequency));
var element = Object.keys(frequency).find(function (key) { return frequency[key] === maxFreq; });
return { element: element, count: maxFreq };
};
/**
* 数组分页
*/
ArrayUtils.paginate = function (arr, page, pageSize) {
var total = arr.length;
var totalPages = Math.ceil(total / pageSize);
var currentPage = Math.max(1, Math.min(page, totalPages));
var start = (currentPage - 1) * pageSize;
var data = arr.slice(start, start + pageSize);
return {
data: data,
total: total,
currentPage: currentPage,
totalPages: totalPages
};
};
/**
* 数组深度比较
*/
ArrayUtils.isEqual = function (arr1, arr2) {
if (arr1.length !== arr2.length)
return false;
return JSON.stringify(arr1.sort()) === JSON.stringify(arr2.sort());
};
/**
* 数组元素统计
*/
ArrayUtils.countBy = function (arr, key) {
return arr.reduce(function (acc, curr) {
var value = String(curr[key]);
acc[value] = (acc[value] || 0) + 1;
return acc;
}, {});
};
/**
* 数组窗口滑动
*/
ArrayUtils.sliding = function (arr, windowSize, step) {
if (step === void 0) { step = 1; }
var windows = [];
for (var i = 0; i <= arr.length - windowSize; i += step) {
windows.push(arr.slice(i, i + windowSize));
}
return windows;
};
/**
* 数组交叉合并
*/
ArrayUtils.zip = function (arr1, arr2) {
var length = Math.min(arr1.length, arr2.length);
return Array.from({ length: length }, function (_, i) { return [arr1[i], arr2[i]]; });
};
/**
* 数组求并集
*/
ArrayUtils.union = function () {
var arrays = [];
for (var _i = 0; _i < arguments.length; _i++) {
arrays[_i] = arguments[_i];
}
return ArrayUtils.unique(arrays.flat());
};
/**
* 数组元素位置交换
*/
ArrayUtils.swap = function (arr, index1, index2) {
var _a;
var result = __spreadArray([], arr, true);
_a = [result[index2], result[index1]], result[index1] = _a[0], result[index2] = _a[1];
return result;
};
/**
* 数组转树形结构
*/
ArrayUtils.toTree = function (arr, parentId) {
if (parentId === void 0) { parentId = null; }
return arr
.filter(function (item) { return item.parentId === parentId; })
.map(function (item) { return (__assign(__assign({}, item), { children: ArrayUtils.toTree(arr, item.id) })); });
};
/**
* 带权重的随机选择
* @param arr 源数组
* @param weights 权重数组
* @returns 根据权重随机选择的元素
*/
ArrayUtils.weightedRandom = function (arr, weights) {
if (arr.length !== weights.length) {
throw new Error('数组长度与权重数组长度不匹配');
}
var totalWeight = weights.reduce(function (sum, weight) { return sum + weight; }, 0);
var random = Math.random() * totalWeight;
for (var i = 0; i < arr.length; i++) {
random -= weights[i];
if (random <= 0) {
return arr[i];
}
}
return arr[arr.length - 1];
};
/**
* 查找最长连续序列
* @param arr 数字数组
* @returns 最长连续序列的长度
*/
ArrayUtils.longestConsecutive = function (arr) {
if (arr.length === 0)
return 0;
var numSet = new Set(arr);
var longest = 0;
Array.from(numSet).forEach(function (num) {
if (!numSet.has(num - 1)) {
var currentNum = num;
var currentStreak = 1;
while (numSet.has(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
longest = Math.max(longest, currentStreak);
}
});
return longest;
};
/**
* 获取滑动窗口最大值
* @param arr 数字数组
* @param k 窗口大小
* @returns 每个窗口的最大值数组
*/
ArrayUtils.maxSlidingWindow = function (arr, k) {
var result = [];
var deque = [];
for (var i = 0; i < arr.length; i++) {
// 移除超出窗口范围的索引
while (deque.length > 0 && deque[0] <= i - k) {
deque.shift();
}
// 移除所有小于当前元素的值
while (deque.length > 0 && arr[deque[deque.length - 1]] < arr[i]) {
deque.pop();
}
deque.push(i);
// 当窗口完全形成后,记录最大值
if (i >= k - 1) {
result.push(arr[deque[0]]);
}
}
return result;
};
/**
* 带条件的分组聚合
* @param arr 源数组
* @param groupKey 分组键
* @param aggregates 聚合函数配置
*/
ArrayUtils.groupByWithAggregates = function (arr, groupKey, aggregates) {
var groups = ArrayUtils.groupBy(arr, groupKey);
var result = {};
for (var _i = 0, _a = Object.entries(groups); _i < _a.length; _i++) {
var _b = _a[_i], key = _b[0], group = _b[1];
result[key] = {};
var _loop_1 = function (aggKey, field, operation) {
switch (operation) {
case 'sum':
result[key][aggKey] = group.reduce(function (sum, item) { return sum + Number(item[field]); }, 0);
break;
case 'avg':
result[key][aggKey] = group.reduce(function (sum, item) { return sum + Number(item[field]); }, 0) / group.length;
break;
case 'max':
result[key][aggKey] = Math.max.apply(Math, group.map(function (item) { return Number(item[field]); }));
break;
case 'min':
result[key][aggKey] = Math.min.apply(Math, group.map(function (item) { return Number(item[field]); }));
break;
case 'count':
result[key][aggKey] = group.length;
break;
}
};
for (var _c = 0, _d = Object.entries(aggregates); _c < _d.length; _c++) {
var _e = _d[_c], aggKey = _e[0], _f = _e[1], field = _f.field, operation = _f.operation;
_loop_1(aggKey, field, operation);
}
}
return result;
};
/**
* 计算多个数组的笛卡尔积
* @param arrays 多个数组
* @returns 笛卡尔积结果
*/
ArrayUtils.cartesianProduct = function () {
var arrays = [];
for (var _i = 0; _i < arguments.length; _i++) {
arrays[_i] = arguments[_i];
}
if (arrays.length === 0)
return [[]];
return arrays.reduce(function (acc, curr) {
return acc.flatMap(function (x) { return curr.map(function (y) { return __spreadArray(__spreadArray([], x, true), [y], false); }); });
}, [[]]);
};
/**
* 数组环形旋转
*/
ArrayUtils.rotate = function (arr, k) {
var len = arr.length;
k = k % len;
var result = __spreadArray([], arr, true);
var temp = result.splice(-k);
return __spreadArray(__spreadArray([], temp, true), result, true);
};
/**
* 计算数组中位数
*/
ArrayUtils.median = function (arr) {
var sorted = __spreadArray([], arr, true).sort(function (a, b) { return a - b; });
var mid = Math.floor(sorted.length / 2);
return sorted.length % 2 === 0
? (sorted[mid - 1] + sorted[mid]) / 2
: sorted[mid];
};
/**
* 动态过滤数组
*/
ArrayUtils.filterDynamic = function (arr, conditions) {
return arr.filter(function (item) {
return conditions.every(function (condition) {
var value = item[condition.field];
switch (condition.operator) {
case '==': return value === condition.value;
case '!=': return value !== condition.value;
case '>': return value > condition.value;
case '<': return value < condition.value;
case '>=': return value >= condition.value;
case '<=': return value <= condition.value;
default: return true;
}
});
});
};
/**
* 数组移动元素
*/
ArrayUtils.move = function (arr, fromIndex, toIndex) {
var result = __spreadArray([], arr, true);
var element = result.splice(fromIndex, 1)[0];
result.splice(toIndex, 0, element);
return result;
};
/**
* 查找数组中的峰值元素索引
*/
ArrayUtils.findPeakElement = function (arr) {
var left = 0;
var right = arr.length - 1;
while (left < right) {
var mid = Math.floor((left + right) / 2);
if (arr[mid] > arr[mid + 1]) {
right = mid;
}
else {
left = mid + 1;
}
}
return left;
};
/**
* 数组的运行时累加
*/
ArrayUtils.runningSum = function (arr) {
var result = __spreadArray([], arr, true);
for (var i = 1; i < result.length; i++) {
result[i] += result[i - 1];
}
return result;
};
/**
* 查找最接近目标值的元素
*/
ArrayUtils.findClosest = function (arr, target) {
return arr.reduce(function (prev, curr) {
return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;
});
};
return ArrayUtils;
}());
exports.default = ArrayUtils;