codus.js
Version:
Library to improve own experience working with JS. :gem:
480 lines (342 loc) • 12.5 kB
JavaScript
const {abc, digits} = require('./data')
class Codus {
rad(value = 1) {
return Math.PI * value / 18e1
}
haversine(lat1, long1, lat2, long2) {
let r = 6378.1
let latDifference = this.rad(lat2 - lat1)
let longDifference = this.rad(long2 - long1)
let side = Math.sin(latDifference / 2)**2 + Math.cos(this.rad(lat1)) * Math.cos(this.rad(lat2)) * Math.sin(longDifference / 2)**2
let result = Math.atan2(Math.sqrt(side), Math.sqrt(1 - side)) * 2
return result * r
}
cords(e) {
let value = e !== undefined
value = value ? value : Number(value)
return {
lat: value ? e.lngLat[1] : value,
long: value ? e.lngLat[0] : value
}
}
search(original = '', toCompare = '', percent = 5e1, startFromBeginning = false) {
let template = new RegExp(toCompare, 'i')
let sizes = [original.length, toCompare.length]
let isValidSize = Math.round(sizes[1] / sizes[0] * 1e2) >= percent
let isIncludeText = startFromBeginning ? original.toLocaleLowerCase().split(toCompare.toLowerCase())[0].length === 0 : template.test(original)
return isValidSize && isIncludeText
}
short(text = '', words = 3) {
let length = typeof text === 'string' ? text.split(' ').length : 0
let result = length <= words ? text : text.split(' ').slice(0, words).join(' ') + '...'
return result
}
round(num = 1, digit = 0) {
return parseFloat(num.toFixed(digit))
}
percent(value = 0, total = 1e1, round = 0) {
let result = this.round(total / 1e2 * value, round)
return result
}
part(value = 0, total = 1e1, round = 0) {
let result = this.round(value / total * 1e2, round)
return result
}
random(list = [], shift = 0) {
let slide = this.percent(shift, list.length)
let index = slide + Math.round(Math.random() * list.length)
while (index > list.length - 1) {
index = slide + Math.round(Math.random() * list.length)
}
let result = list[index]
return result
}
card(text = '', isConvert = true) {
let result = ''
if (isConvert) {
text.split('').filter(el => !isNaN(el) && el !== ' ').slice(0, 16).map((el, idx) => {
if ((idx + 1) % 4 === 0) {
result += `${el}-`
} else {
result += el
}
})
result = result.slice(0, result.length - 1)
} else {
result = text.split('-').join('').slice(0, 16)
}
return result
}
calories(weight = 7e1, distance = 5e2, pulse = 11e1, round = 0) {
let minutes = distance * 5
let result = weight * minutes * 14e-3 * (12e-2 * (pulse - 7))
result = this.round(result, round)
return result
}
debounce(func, timestamp = 5e2) {
let timeout
return function() {
clearInterval(timeout)
timeout = setTimeout(() => func.apply(this, arguments), timestamp)
}
}
go(url = '') {
window.open(url)
}
copy(text = '') {
window.navigator.clipboard.writeText(text)
}
cash(change = 1e3, coins = []) {
let values = []
let index = coins.length - 1
while (change !== 0 || index > 0) {
let coin = coins[index]
let result = Math.floor(change / coin)
if (result !== 0) {
values = [...values, {coin, amount: result}]
change -= result * coin
}
index--
}
return {values, change}
}
mutateObject(object = {}, properties = [], values = []) {
properties.map((property, idx) => {
object[property] = values[idx]
})
return object
}
splice(list = [], borders = [], values = [], check = null) {
let result = list.slice(0, borders[0])
for (let i = borders[0]; i < borders[1]; i++) {
let item = list[i]
let value = values[i - borders[0]]
let valid = eval(`${item} ${check}`)
result = [...result, valid ? value : item]
}
result = [...result, ...list.slice(borders[1])]
return result
}
is(obj1 = {}, obj2 = {}, round = 0) {
let keys1 = Object.keys(obj1)
let keys2 = Object.keys(obj2)
let length = keys1.length >= keys2.length ? keys1.length : keys2.length
let result = 0
for (let i = 0; i < length; i++) {
if (keys1[i] === keys2[i]) {
result++
}
}
result = this.part(result, length, round)
return result
}
depth(list = [], position = 1) {
let result = 0
for (let i = 0; i < list.length; i++) {
let value = list[i]
let counter = 0
while (Array.isArray(value)) {
value = value[Boolean(counter) ? 0 : position - 1]
counter++
}
if (counter > result) {
result = counter
}
}
return result
}
objectFilter(obj = {}, type = 'string') {
let result = Object.fromEntries(Object.entries(obj).filter(([_, value]) => typeof value === type))
return result
}
filterArrayByDigit(list = [], index = 1, value = 1) {
let result = []
list.map(el => {
if (Number(String(el).split('').reverse()[index]) === value) {
result = [...result, el]
}
})
return result
}
reverseObject(obj = {}) {
let result = Object.fromEntries(Object.entries(obj).map(([key, value]) => [value, key]))
return result
}
textSubstring(text = '', substring = '') {
let result = 0
substring = substring.trim().toLocaleLowerCase()
text.split(' ').map(el => {
if (el.toLocaleLowerCase().includes(substring)) {
result++
}
})
return result
}
binary(num = null, isConvert = true) {
if (num === null) {
return num
}
let result
if (isConvert) {
result = ''
while (num > 0) {
let residue = num % 2
let isEven = residue === 0
if (!isEven) {
num -= residue
}
result += isEven ? '0' : '1'
num /= 2
}
result = result.split('').reverse().join('')
} else {
result = 0
num.split('').reverse().map((el, idx) => {
result += Number(el) * 2**idx
})
result = Number(result)
}
return result
}
getObjectProperty(obj = {}, properties = []) {
let result = obj[properties[0]]
for (let i = 1; i < properties.length; i++) {
result = result[properties[i]]
}
return result
}
sum(list = [], isEven = null, min = 0, max = 1e6) {
let result = 0
list = list.filter(el => el >= min && el <= max)
if (isEven !== null) {
list = list.filter(el => el % 2 === 0 && isEven || el % 2 !== 0 && !isEven)
}
result = list.reduce((acc, cur) => acc + cur)
return result
}
wordEnd(num = 1, base = 'поезд', isLessHalf= 'а', isMoreHalf = 'ов') {
let text = String(num)
let last = Number(text[text.length - 1])
let result = ''
if (num >= 1e2) {
num %= 1e2
}
if (last === 1 && ( num >= 2e1 || num === 1)) {
result = base
} else if (last < 5 && (num < 1e1 || num > 2e1)) {
result = base + isLessHalf
} else if (last >= 5 || (num > 1 && num < 2e1)) {
result = base + isMoreHalf
}
return result
}
countSpacesByWordsLength(text = '', min = 1, max = 1e1) {
let array = text.split(' ')
let result = 0
array.map((el, idx) => {
let next = array[idx + 1]
if (next) {
let items = [el, next].map(item => item.length)
let flag = true
items.map(item => {
if (item < min || item > max) {
flag = false
}
})
if (flag) {
result++
}
}
})
return result
}
filterObjectProperties(obj = {}, text = '') {
let keys = Object.keys(obj).filter(el => el.includes(text))
let result = Object.fromEntries(keys.map(el => [el, obj[el]]))
return result
}
findUppercasePart(text = '', round = 0) {
let result = 0
text = text.split(' ')
text.map(word => {
let letter = word[0]
if (letter.toLowerCase() !== letter) {
result++
}
})
result = this.part(result, text.length, round)
return result
}
id(length = 1, isNum = true, uppercaseSchema = []) {
let letters = isNum ? [...abc, ...digits] : abc
let result = ''
let pointer = 0
for (let i = 0; i < length; i++) {
let position = i + 1
let value = letters[Math.floor(Math.random() * letters.length)]
if (position % uppercaseSchema[pointer] === 0) {
value = value.toUpperCase()
pointer++
}
result += value
}
return result
}
findWordByDynamicLength(text = '', percent = 5e1) {
let words = text.split(' ')
let max = Math.max(...words.map(el => el.length))
let length = this.percent(percent, max, 0)
let result = words.find(el => el.length === length)
return result
}
direction(lat1, long1, lat2, long2) {
let result = lat1 > lat2 ? 'south ' : 'north '
result += long1 > long2 ? 'west' : 'east'
return result
}
passwordDifficulty(text = '', base = 1, multiplier = 1.5) {
const length = text.length
let middle = length / 2
let result = length
text = text.split('')
for (let i = 0; i < middle; i++) {
let current = text[i]
let next = text[i + 1]
let points = 0
if (next) {
if (current !== next) {
points += base * multiplier
}
if (current.toUpperCase() !== current && next.toUpperCase() === next) {
points += base
}
if (next.toUpperCase() !== next && current.toUpperCase() === current) {
points += base
}
if (isNaN(current) && !isNaN(next) || !isNaN(current) && isNaN(next)) {
points += base * multiplier
}
}
result += points
}
return result
}
hash(schema = [], divider = '-') {
const length = schema.length
let result = ''
schema.map((size, idx) => {
let piece = ''
for (let i = 0; i < size; i++) {
let flag = Math.round(Math.random() * 1e2) > 50
let items = flag ? abc : digits
piece += items[Math.floor(items.length * Math.random())]
}
if (idx + 1 < length) {
piece += divider
}
result += piece
})
return result
}
}
module.exports = {Codus}