Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 2x 15x 15x 14x 15x 37x 37x 14x 14x 2x 253x 141x 141x 253x 10x 10x 131x 131x 253x 3x 3x 128x 128x 253x 21x 21x 107x 107x 253x 31x 5x 5x 26x 26x 29x 2x 2x 28x 33x 33x 33x 33x 29x 29x 33x 10x 10x 33x 14x 90x 90x 2x 54x 54x | import { isArray, isDate, isObject, isSymbol } from './general' function looseCompareArrays(a: any[], b: any[]) { if (a.length !== b.length) return false let equal = true for (let i = 0; equal && i < a.length; i++) { equal = looseEqual(a[i], b[i]) } return equal } export function looseEqual(a: any, b: any): boolean { if (a === b) return true let aValidType = isDate(a) let bValidType = isDate(b) if (aValidType || bValidType) { return aValidType && bValidType ? a.getTime() === b.getTime() : false } aValidType = isSymbol(a) bValidType = isSymbol(b) if (aValidType || bValidType) { return a === b } aValidType = isArray(a) bValidType = isArray(b) if (aValidType || bValidType) { return aValidType && bValidType ? looseCompareArrays(a, b) : false } aValidType = isObject(a) bValidType = isObject(b) if (aValidType || bValidType) { if (!aValidType || !bValidType) { return false } const aKeysCount = Object.keys(a).length const bKeysCount = Object.keys(b).length if (aKeysCount !== bKeysCount) { return false } for (const key in a) { const aHasKey = a.hasOwnProperty(key) const bHasKey = b.hasOwnProperty(key) if ( (aHasKey && !bHasKey) || (!aHasKey && bHasKey) || !looseEqual(a[key], b[key]) ) { return false } } } return String(a) === String(b) } export function looseIndexOf(arr: any[], val: any): number { return arr.findIndex(item => looseEqual(item, val)) } |