大侠
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

147 lines
4.1 KiB

/**
* 数组工具
*/
export default class ArrayUtils {
/**
* 数组去重保留靠前的内容
* @param arr 源数组
*/
public static Unique<T>(arr: T[]): T[] {
return Array.from(new Set(arr));
}
/**
* 数组去重保留靠后的内容
* @param arr 源数组
*/
public static ReverseReserveUnique<T>(arr: T[]): T[] {
return Array.from(new Set(arr.reverse())).reverse();
}
/**
* 对象数组去重
* @param arr 源数组
* @param _F 获取对比键值函数
*/
public static ObjUnique<T>(arr: T[], _F: (o: T) => string): T[] {
for (let i = 0, len = arr.length; i < len; i++) {
for (let j = i + 1, len = arr.length; j < len; j++) {
if (_F(arr[i]) === _F(arr[j])) {
arr.splice(j, 1);
j--; // 每删除一个数j的值就减1
len--; // j值减小时len也要相应减1(减少循环次数,节省性能)
}
}
}
return arr;
}
/**
* 替换数组的某个元素
* @param arr 源数组
* @param oldObj 被替换的元素
* @param newObj 替换元素
*/
public static Replace<T>(arr: T[], oldObj: T, newObj: T): boolean {
let index = arr.indexOf(oldObj);
if (index < 0) return false;
arr.splice(index, 1, newObj);
return true;
}
/**
* 删除一个元素并返回结果
* @param arr 源数组
* @param obj 删除目标对象
*/
public static RemoveItem<T>(arr: T[], obj: T): boolean {
let index = arr.indexOf(obj);
if (index < 0) return false;
arr.splice(index, 1);
return true;
}
/**
* 根据索引删除一个数据
* @param arr 源数组
* @param index 索引
*/
public static RemoveAt<T>(arr: T[], index: number): boolean {
if (arr.length <= index) return false;
arr.splice(index, 1);
return true;
}
/**
* 数组是否包含某个数据
* @param arr
* @param obj
*/
public static Contains<T>(arr: T[], obj: T): boolean {
let index = arr.indexOf(obj);
return index >= 0;
}
/**
* 复制一个数组
* @param arr 源数组
*/
public static Copy<T>(arr: T[]): T[] {
let result = [];
for (let i = 0; i < arr.length; ++i) {
result.push(arr[i]);
}
return result;
}
/**
* 随机打乱数组
* @param _array 目标数组
*/
public static upsetArray<T>(_array: T[]): T[] {
//乱序
return _array.sort(() => {
return Math.random() - 0.5;
});
}
/**
* 随机获取数组中的随机值,可指定长度
* @param _array 原数组
* @param _n 随机个数
* @param _weight 权重列表
*/
public static RandomGet<T>(_array: T[], _n: number = 1, _weight: number[] = _array.map((item) => { return 1; })): T[] {
if (_array.length <= 0) { return; }
let _rootArray: T[] = [];
let _newArray: T[] = [];
//权重索引列表
let _indexArray: number[] = [];
//找到最小的权重
let _minWeight: number = _weight[0];
_weight.forEach((item) => {
_minWeight = Math.min(_minWeight, item);
});
_weight = _weight.map((item) => {
return Math.floor(item * (1 / _minWeight));
});
_array.forEach((item, index) => {
_rootArray.push(item);
//
for (let _i = 0; _i < _weight[index]; _i++) {
_indexArray.push(index);
}
});
let _index: number;
for (let _i = 0; _i < _n; _i++) {
if (_rootArray.length <= 0) { break; }
_index = Math.floor(Math.random() * _indexArray.length);
_indexArray = _indexArray.filter((item) => {
return item != _index;
});
_newArray.push(_rootArray.splice(_indexArray[_index], 1)[0]);
}
//
return _newArray;
}
}