npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

jsutils2

v2.0.0

Published

"Various utility functions for javascript."

Readme

Any examples shown don't use require or any of that. The examples are shown as if they are imported using a <script> tag.

Documentation

Any

Exists

exists :: any => boolean

Checks if a value exists. (if it isn't undefined or null)

exists(5);
=> true
exists([2, 3][4]);
=> false

Identity

identity :: any => any

Returns the passed parameter. Can be used to evaluate a boolean value like i < 3.

identity(5);
=> 5
identity(3 < 4);
=> true

Print

print :: (...any) => void

Prints any number of values to the console. Each value is on a separate line.

Note: Will not work properly with the Firefox dev console, and probably some other devices. This works best in some text editors such as Atom.io.

print(2, 3, 4);
=> 2
=> 3
=> 4

Array

Apply

apply :: (array, function) => any

Applies a function that accepts spread arguments to an array.

apply([2, 3, 4, 5], Math.min); //Applies Math.min, which usually takes spread arguments, to the array passed in
=> 2

Choice

choice :: array | string => any

Selects a random value from an array. This can work on strings as well, as they are indexable.

repeat(10, () => print(choice([1, 2, 3, 4, 5, 6])));
=> 1
=> 6
=> 4
=> 2
=> 2
=> 3
=> 5
=> 1
=> 5
=> 1

Concat

concat :: (any, any) => array

Joins any 2 items into a single array. Can join 2 arrays together as well.

concat(2, 3);
=> [2, 3]
concat([5, 3], [4, 2]);
=> [5, 3, 4, 2]

ConcatAll

concatAll :: array => array

Joins all items of an array into a single array. This effectively flattens the top layer of an array.

concatAll([2, 3, [4, 5], [6, 7]]);
=> [2, 3, 4, 5, 6, 7]
concatAll([3, [4, [5, 6]], [7, 8]]);
=> [3, 4, [5, 6], 7, 8]

Count

count :: (array, function) => number

Counts the number of elements in an array that meet a condition.

count([2, 3, 4, 5], e => e < 4);

DropWhile

dropWhile :: (array, function) => array

Drops items from an array that meet a condition until it finds one that doesn't meet a condition.

dropWhile([5, 3, 1, 6, 8, 7, 9], isOdd);
=> [6, 8, 7, 9]

Flatten

flatten :: array => array

Flattens an array down to a one-dimensional array.

flatten([[[2, 3], 4, 5], [6, 7], 8]);
=> [2, 3, 4, 5, 6, 7, 8]

Head

head :: array => any

Gets the first value of an array.

head([2, 3, 4]);
=> 2

Insert

insert :: (array, index: number, item: any) => array

Inserts an item at a specific index of an array.

insert([2, 3, 4, 5, 6], 1, 7);
=> [2, 7, 3, 4, 5, 6]

IsArray

isArray :: any => bool

Returns if a given value is an array.

isArray(5);
=> false
isArray([2, 3]);
=> true

Max

max :: array<number> => number

Returns the largest value of an array.

max([5, 2, 9, 10, 6, 3]);
=> 10

Min

min :: array<number> => number

Returns the smallest value of an array.

min([5, 2, 9, 10, 6, 3]);
=> 2

None

none :: (array, function) => boolean

Returns if none of the values of an array meet a condition.

none([2, 3, 4, 5], e => e < 4);
=> false
none([2, 3, 4, 5], e => e < 1);
=> true

Product

product :: array<number> => number

Gets the product of the values of the array.

product([5, 7, 3]);
=> 105

Quicksort

quicksort :: array<number> => array<number>

Sorts an array using the Quicksort algorithm.

quicksort([5, 2, 9, 8, 1, 7, 3]);
=> [1, 2, 3, 5, 7, 8, 9]

Range

range :: (low: number, high: number?, step: number? = 1) => array<number>

Creates a range of numbers between 2 values, with a given step. Based on Python's built-in range function.

range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
range(2, 13, 3);
=> [2, 5, 8, 11]
range(5, -5, -1);
=> [5, 4, 3, 2, 1, 0, -1, -2, -3, -4]
range(5);
=> [0, 1, 2, 3, 4]

Reject

reject :: (array, function) => array

Returns a version of an array without any items that meet a condition.

reject([2, 3, 4, 5, 7, 8, 9, 11], isEven);
=> [3, 5, 7, 9, 11]

RemoveEachItem

removeEachItem :: (array, item: any) => array

Removes every instance of a value from an array.

removeEachItem([2, 3, 4, 3, 5, 6], 3);
=> [2, 4, 5, 6]

RemoveIndex

removeIndex :: (array, index: number) => array

Removes a value at an index from an array.

removeIndex([2, 3, 4, 5, 6], 2);
=> [2, 3, 5, 6]

RemoveItem

removeItem :: (array, item: any) => array

Removes a specific item from an array. (Only 1 instance of the item)

removeItem([2, 3, 4, 5, 6], 3);
=> [2, 4, 5, 6]

ReplaceEachItem

replaceEachItem :: (array, item: any, item2: any) => array

Replaces each instance of a value in an array with a different value.

replaceEachItem([2, 3, 4, 3, 5, 6], 3, 7);
=> [2, 7, 4, 7, 5, 6]

Reverse

reverse :: array => array

Reverses an array. Operates as a pure function, to avoid modifying the original array.

reverse([2, 3, 4]);
=> [4, 3, 2]

Partition

partition :: (array, function) => array<array>

Splits an array into 2 arrays, where one contains items that meet a condition, and the second contains items that don't.

partition([2, 3, 4, 5, 7, 8, 9, 11], isEven);
=> [[2, 4, 8], [3, 5, 7, 9, 11]]

PartitionWith

partitionWith :: (array, ...function) => array<array>

Returns an array of arrays, where each array successively contains items that meet a condition.

partitionWith([2, 3, 4, 5, 7, 8, 9, 11], isEven, e => isDivisible(e, 3));
=> [[2, 4, 8], [3, 9], [5, 7, 11]]

Shuffle

shuffle :: array => array

Shuffles the values in an array randomly.

repeat(10, () => print(shuffle([1, 2, 3, 4, 5, 6])));

=> [3, 1, 2, 6, 5, 4]
=> [5, 2, 6, 4, 3, 1]
=> [5, 2, 3, 6, 4, 1]
=> [2, 4, 3, 1, 5, 6]
=> [3, 2, 1, 5, 4, 6]
=> [1, 6, 4, 3, 5, 2]
=> [2, 5, 1, 6, 3, 4]
=> [5, 6, 1, 3, 4, 2]
=> [5, 3, 1, 6, 2, 4]
=> [2, 3, 6, 1, 5, 4]

Sum

sum :: array<Addable> => Addable

Adds together each item of an array. The Addable notation applies to anything that works with the + operator, which means numbers and strings.

sum([2, 3, 4, 5]);
=> 14
sum(["str", "ing"]);
=> "string"

Tail

tail :: array => array

Returns everything except for the first value of an array. If the array has one item, it returns an empty array.

head([2, 3, 4]);
=> [3, 4]

TakeWhile

takeWhile :: (array, function) => array

Takes items from an array while they meet a condition.

takeWhile([2, 4, 6, 8, 1, 7, 9, 8], isEven);
=> [2, 4, 6, 8]

ToArray

toArray :: any => array

Converts a given value to an array. If the value is already an array, it remains as it is.

toArray(5);
=> [5]
toArray([5]);
=> [5]

Functional

Compose

compose :: (...function) => any => any

Returns a function that applies any number of functions in natural order. Works very well with currying and partial application.

compose(e => e / 2, square)(3);
=> 4.5

Partial

partial :: (function, ...any) => (...any) => any

Returns a function that applies any number of arguments to a function, and which accepts any number of arguments to complete the function.

partial(Math.max, 2, 3, 4)(5, 1);
=> 5

ReverseArgs

reverseArgs :: function => (...any) => any

A variant of spreadArgs that operates in reverse order.

reverseArgs(concatAll)([2, 3], [4, 5], [6, 7]);
=> [6, 7, 4, 5, 2, 3]

Sequence

sequence :: (...function) => any => any

Returns a function that applies any number of functions in reverse order. Works very well with currying and partial application.

sequence(e => e / 2, square)(3);
=> 2.25

SpreadArgs

spreadArgs :: function => (...any) => any

Converts a function that takes an array to one that takes a spread.

spreadArgs(sum)(2, 3, 4);
=> 9

Math

Accumulator Functions

:: (number, number) => number

These functions accept 2 operators, and are designed to be used with reduce and similar functions.

  • add
  • subtract
  • multiply
  • divide
  • mod
  • pow (works like Math.pow)
  • bitor (bitwise operators)
  • bitand
  • bitxor
  • leftshift (bitshifts)
  • rightshift

Cbrt

cbrt :: number => number

Gets the cube root of a number. Alias for Math.cbrt.

cbrt(64);
=> 4

Cosine

cosine :: number => number

Version of Math.cos which returns degrees.

cosine(60);
=> 0.5

Cube

cube :: number => number

Cubes a number.

cube(5);
=> 125

Factorial

number :: number => number

Gets the factorial of a number.

factorial(10);
=> 3628800

Floor

floor :: (number, number? = 0) => number

Rounds a given number down to a specific number of decimal places.

floor(20.56, 1);
=> 20.5

IsBetween

isBetween :: (number, number, number) => boolean

Returns if a number is between 2 other numbers.

isBetween(5, 4, 6);
=> true
isBetween(3, 4, 6);
=> false

IsDivisible

isDivisible :: (number, number) => boolean

Checks if 2 numbers are divisible by each other.

isDivisible(9, 3);
=> true
isDivisible(5, 4);
=> false

IsEven

isEven :: number => number

Checks if a number is an even number.

isEven(6);
=> true
isEven(5);
=> false

IsFibonacci

isFibonacci :: number => number

Checks if a number is a Fibonacci number.

isFibonacci(55);
=> true
isFibonacci(57);
=> false

IsOdd

isOdd :: number => number

Checks if a number is an odd number.

isOdd(5);
=> true
isOdd(6);
=> false

IsPrime

isPrime :: number => number

Checks if a number is a prime number.

isPrime(59);
=> true
isPrime(63);
=> false

IsWhole

isWhole :: number => boolean

Checks if a number is a whole number.

isWhole(7);
=> true
isWhole(6.6);
=> false

NRoot

nRoot :: (number, number) => number

Gets the nth root of a number.

nRoot(81, 3);
=> 4

PI

PI :: number

An alias for Math.PI.

RandInt

randInt :: (low: number, high: number) => number

Generates a random number between 2 other numbers.

repeat(10, () => print(randInt(1, 6)));
=> 5
=> 1
=> 5
=> 1
=> 3
=> 4
=> 2
=> 2
=> 3
=> 3

Random

random :: () => number

Alias for Math.random.

Round

round :: (number, number? = 0) => number

Rounds a given number to a specific number of decimal places.

round(20.53, 1);
=> 20.5

Sine

sine :: number => number

Version of Math.sin which returns degrees.

sine(60);
=> 0.8660254038...

Sqrt

sqrt :: number => number

Gets the square root of a number. Alias for Math.sqrt.

sqrt(16);
=> 4

Square

square :: number => number

Squares a number.

square(5);
=> 25

Tangent

tangent :: number => number

Version of Math.tan which returns degrees.

tangent(60);
=> 1.73205080757...

Triangular

triangular :: number => number

Converts a number to a corresponding triangular number.

triangular(10);
=> 55

Object

HasKey

hasKey :: (object, any) => boolean

Checks if an object has a key.

hasKey({2: 3, 3: 4}, 3);
=> true
hasKey({2: 3, 3: 4}, 1);
=> false

Pluck

pluck :: (object, any) => any

Extracts a value from an object. Good for map and related functions.

pluck({1: 2, 2: 3}, 2);
=> 3

String

StrShuffle

strShuffle :: string => string

Shuffles the characters in a string.

repeat(10, () => print(shuffle("string")));
=> "snirtg"
=> "gnirst"
=> "tingsr"
=> "gnrits"
=> "igtnrs"
=> "irtgns"
=> "rgtins"
=> "stgrin"
=> "nsitgr"
=> "trnsgi"

StrInsert

strInsert :: (string, index: number, item: string) => string

Inserts a string at a specific index of a string.

strInsert("string", 2, "ar")
=> "starring"

StrRemoveEachItem

strRemoveEachItem :: (string, item: any) => string

Removes every instance of a value from a string.

strRemoveEachItem("string is a string", "string");
=> " is a "

StrRemoveIndex

strRemoveIndex :: (string, index: number) => string

Removes a value at an index from a string.

strRemoveIndex("string", 2);
=> "sting"

StrRemoveItem

strRemoveItem :: (string, item: any) => string

Removes a specific item from a string. (Only 1 instance of the item)

strRemoveItem([2, 3, 4, 5, 6], 3);
=> [2, 4, 5, 6]

StrReverse

strReverse :: string => string

Reverses a string without modifying the original string.

strReverse("string");
=> "gnirts"

Structures

Repeat

repeat :: (number, function)

Executes a given function a certain number of times. It can accept arguments in the function.

repeat(5, () => print("Hello world!"));
=> "Hello world!"
=> "Hello world!"
=> "Hello world!"
=> "Hello world!"
=> "Hello world!"

Until

until :: (cond: function, function)

Executes a function until the condition is true.

let i = 1;

until(() => i > 10, () => {
    print(i);
  	i++;
});
=> 1
=> 2
=> 3
=> 4
=> 5
=> 6
=> 7
=> 8
=> 9
=> 10