let arrUtil = { /** * 随机排序 * @param arr */ randomSort(arr: Array) { for (let j, x, i = arr.length; i; j = (Math.random() * i) | 0, x = arr[--i], arr[i] = arr[j], arr[j] = x) { ; } }, /** * 移除数组index位置的元素 * @param arr * @param index */ spliceOne(arr: any[], index: number): boolean { if (index === -1 || index >= arr.length) { return false; } const len = arr.length - 1; for (let i = index; i < len; i++) { arr[i] = arr[i + 1]; } arr.length = len; return true; }, /** * 检查数组中是否含有另外一个object * @param arr 目标数组 * @param obj 与数组同类型的obj | 同类型的数组 | 指定child字段的值 | 指定child字段的数组 * @param child 比较字段 */ contains(arr: Array, obj: any, child: string): boolean { let result = false; if (child) { const isArr = Array.isArray(obj); if (isArr) { if (obj[0].hasOwnProperty(child)) { let set0 = new Set(); for (let s of obj) { set0.add(s[child]); } let set1 = new Set(arr.filter (x => set0.has(x))); return set0.size === set1.size; } else { let set0 = new Set(obj); let set1 = new Set(arr.filter (x => set0.has(x))); return set1.size === set0.size; } } else { if (obj.hasOwnProperty(child)) { for (let sub of arr) { if (sub.hasOwnProperty(child)) { // @ts-ignore if (sub[child] === obj[child]) { result = true; break; } } } } else { for (let sub of arr) { if (sub.hasOwnProperty(child)) { // @ts-ignore if (sub[child] === obj) { result = true; break; } } } } } } else { // 不指定 比较字段 的话, 只处理2种情况 // 1: obj 为数组 // 2: obj 不是数组 if (Array.isArray(obj)) { let set0 = new Set(obj); let set1 = new Set(arr.filter (x => set0.has(x))); return set1.size === set0.size; } else { let idx = arr.indexOf(obj); return !!(~idx); } } return result; }, /** * 将数组2随机插入数组1中 * @param arr1 * @param arr2 */ randomInsert(arr1: Array, arr2: Array) { const length = arr1.length; arr2.forEach(value => { arr1.splice(Math.random() * length, 0 , value); }) return arr1; }, /** * 随机获取n个元素 * @param arr * @param count */ randomGet(arr: Array, count: number = 1) { let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; if (min < 0) { return shuffled; } while (i-- > min) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(min); }, /** * 随机获取1个 * @param arr */ randomOne(arr: Array) { let results = this.randomGet(arr, 1); if (results.length > 0) { return results[0]; } else { return null; } }, /** * 随机移除n个元素 * @param arr * @param count */ randomRemove(arr: Array, count: number = 1) { let result = []; while (count -- > 0 && arr.length > 0) { let index = Math.random() * arr.length | 0; result.push(...arr.splice(index, 1)); } return result; }, /** * 数组移动n位 * @param arr * @param n n > 0 右移, n<0 左移 */ moveElement(arr: Array, n: number) { if (Math.abs(n) > arr.length) n = n % arr.length; return arr.slice(-n).concat(arr.slice(0, -n)); } } export default arrUtil;