xtorcga
Version:
Xtor Compute Geometry Algorithm Libary 计算几何算法库
107 lines (89 loc) • 2.86 kB
text/typescript
/*
* @Description :
* @Author : 赵耀圣
* @Q群 : 632839661
* @Date : 2020-12-10 15:01:42
* @LastEditTime : 2021-09-10 11:15:02
* @FilePath : \object_framed:\github\cga.js\src\utils\array.ts
*/
import { delta4, toFixed as toFixedOne } from '../math/Math';
(Array.prototype as any).get = function (index: number): any {
if (index < 0)
index = this.length + index;
return this[index]
};
(Array.prototype as any).last = function (): any {
return this.get(-1);
};
/**
* 遍历多级数组中所有对象
* @param {Array} array
* @param {Function} method
*/
export function forall(array: Array<any>, method: (arg0: any, index?: number, that?: Array<any>) => void) {
for (let i = 0; i < array.length; i++) {
const ele = array[i];
method(ele, i, array);
if (Array.isArray(ele))
forall(ele, method)
}
}
export function flat(array: any[]): any[] {
if ((<any>array).flat)
return (<any>array).flat(Infinity);
return array.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flat(cur) : cur);
})
}
/**
* 分类
* example:
* var arry = [1,2,3,4,5,6]
* var result = classify(array,(a)={return a%2===0})
*
* @param {Array} array
* @param {Function} classifyMethod 分类方法
*/
export function classify(array: Array<any>, classifyMethod: (arg0: any, arg1: any, arg2: any[]) => any) {
var result: any = [];
for (let i = 0; i < array.length; i++) {
for (let j = 0; j < result.length; j++) {
if (classifyMethod(array[i], result[j][0], result[j])) {
result[j].push(array[i]);
} else {
result.push([array[i]]);
}
}
}
return result;
}
/**
* 去掉重复元素
* @param {Array} array
* @param {Function} uniqueMethod 去重复
* @param {Function} sortMethod 排序 存在就先排序再去重复
*/
export function unique(array: any[], uniqueMethod: (arg0: any, arg1: any) => boolean, sortMethod?: (a: any, b: any) => number) {
if (sortMethod) {
array.sort(sortMethod);
for (let i = 0; i < array.length; i++) {
for (let j = i + 1; j < array.length; j++) {
if (uniqueMethod(array[i], array[j]) === true) {
array.splice(j, 1);
j--
} else
break;
}
}
return array;
}
for (let i = 0; i < array.length; i++) {
for (let j = i + 1; j < array.length; j++) {
if (uniqueMethod(array[i], array[j]) === true) {
array.splice(j, 1);
j--
}
}
}
return array;
}