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 🙏

© 2024 – Pkg Stats / Ryan Hefner

perfected-prototypes

v2.3.0

Published

An easy way to extend the built in Javascript prototype chains and make JS fun again

Downloads

23

Readme

Perfected-Prototypes

npm version Build Status

An extension to the Javascript Object, Array, and String prototype chain. Extending the limited functionality to what it should have been the first time around. Such as being able to search for things logically within an array, getting the first and last elements of an array. Or even being able to safely dereference an object without crashing.

Features

  • Small package size (~29.1kB)
  • Well tested
  • Easy to install
  • JSdoc documentated
  • Works both in ES5 & up, and Node.JS
  • Uses Object.defineProperty to avoid pollution of chain methods
  • Checks to make sure there isn't overwritten methods

Installation

Using NPM:

$ npm install -s perfected-prototypes

Or Yarn:

$ yarn add perfected-prototypes

Testing

Simply run a npm install to add the testing library Then run:

$ npm run test

Usage

Simply require the module into your NodeJS project, no need to assign it to a variable or anything:

require('perfected-prototypes')

Or, if you want to use it on the front end say in a React or Angular Project:

import "perfected-prototypes"

And that's it! You're ready to go.

API

Object Methods:

Object.try()

Safely access any value on an object and have it return false upon not finding value, Example:

require('perfected-prototypes')

const foo = {
   a: {
      b: 1, 
      c: [1,2,3]
   }
}

console.log(foo.try('a.b'))
// => 1

console.log(foo.try('a.c[1]'))
// => 2

console.log(foo.try('a.b.c.d.e.f'))
// => undefined

Object.eachKeyValue()

Loop over each key and value returning undefined

const foo = { a: 1, b: 2 }

foo.eachKeyValue((key, val) => {
   console.log(key, val)
})

// => a 1
// => b 2

Object.mapOver()

Similar to forEach But this returns the objects returned at the end of the mapOver function

const foo = { a: 1, b: 2 }

console.log(foo.mapOver((key, val) => {
            key = key + '1'
            val = val * 2
            return { [key]: val }
         })
)
// => {a1: 2, b2:4}

Object.reduce()

Reduce the values witin an object to summate them

const foo = { a: 1, b: 2, c: 3, d: 4 }

console.log(foo.reduce((prev, [key, val]) => prev + val, 0))
// => 10

const foo = { a: 1, b: 2, c: 3, d: 4 }

console.log(foo.reduce((prev, [key, val]) => {prev.push(val); return prev}, []))
// => [1,2,3,4]

Object.hasData()

Test to see if there is any values within your object

const foo = {}

console.log(foo.hasData())
// => true

OR:

const foo = {a:1}

console.log(foo.hasData())
// => false

Object.mergeObjects()

Merge one or any amount of objects together, with key/value presedence dependent on order of objects passed in

const foo = {a:1}
const bar = {b:2}

console.log(foo.mergeObjects(bar))
// => {a:1, b:2}

OR:

const foo = {a:1}
const bar = {b:2}
const baz = {c:3}

console.log(foo.mergeObjects(bar,baz))
// => {a:1, b:2, c:3}

Object.deepCopy()

Deep copy the object with JSON.parse(JSON.stringify()), erasing any object references

const foo = {a:1, b:2}

const bar = foo.deepCopy()
bar.a = 2

console.log(bar)
// => {a:2,b:2}

console.log(foo)
// => {a:1, b:2}

Object.deepEqual()

Checks the equality between two objects

const obj1 = {a: 1, b:'2'}
const obj2 = {a: 1, b:'2'}

console.log(obj1.deepEqual(obj2))
// => true

Object.isObject()

Checks to see if the value passed in is an object (not arrays or functions) Also on the actual Object not on the prototype chain

const foo = {}
const bar = []
const baz = function() { return 2}

console.log(Object.isObject(foo))
// => true

console.log(Object.isObject(bar))
// => false

console.log(Object.isObject(baz))
// => false

Array Methods:

Array.first

A getter to easily get the first element of an array

const arr = [1,2,3,4,5]

console.log(arr.first)
// => 1

Array.last

A getter to easily get the last element of the array

const arr = [1,2,3,4,5]

console.log(arr.last)
// => 5

Array.access()

Access values within the array in a python like style, such that negative indexing is allowed

const arr = [1,2,3]

console.log(arr.access(-1))
// => 3

Array.remove()

Remove all instances of a value within the array and return new array

const arr = [1,2,2,3,4,5]

console.log(arr.remove(2))
// => [1,3,4,5]

Array.yank()

Returns and removes the specified values and mutates the actual array

const arr = [1,2,3,4,5]

console.log(arr.yank(2))
// => 2
console.log(arr)
// => [1,3,4,5]

console.log(arr.yank([3,4]))
// => [3,4]
console.log(arr)
// => [1,2,5]

Array.clear()

Clear the array being worked on, and return a new empty array

const arr = [1,2,3,4,5]

console.log(arr.clear())
// => []

OR:


const arr = [1,2,3,4,5]
arr.clear()

console.log(arr)
// => []

Array.unique()

Get the unique values of an array

const arr = [1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 6]

console.log(arr.unique())
// => [1,2,3,4,5,6]

Array.uniqueBy()

Filter an array of objects to unique set of objects by some selector

const arr = [{ name: 'bob', job: 'wood' }, { name: 'bob', job: 'wood' }]

console.log(arr.uniqueBy('name'))
// => [{ name: 'bob', job: 'wood' }]

Array.isEmpty()

Checks to see if the array is empty

const arr = [1,2,3]
console.log(arr.isEmpty())
// => false

const arr  = []
console.log(arr.isEmpty())
// => true

Array.findObj()

Search for the first value that matches query in array, implemented with lodash 'find' function

Using a function:

const users = [
   { 'user': 'barney', 'age': 36, 'active': true },
   { 'user': 'fred', 'age': 40, 'active': false },
   { 'user': 'pebbles', 'age': 1, 'active': true }
];


console.log(users.findObj(o => { return o.age < 40 }))
// => { 'user': 'barney', 'age': 36, 'active': true }

Using an object:


const users = [
   { 'user': 'barney', 'age': 36, 'active': true },
   { 'user': 'fred', 'age': 40, 'active': false },
   { 'user': 'pebbles', 'age': 1, 'active': true }
];

console.log(const res = users.findObj({ 'user': 'barney', 'age': 36, 'active': true }))
// => { 'user': 'barney', 'age': 36, 'active': true }

Using array of values:

const users = [
   { 'user': 'barney', 'age': 36, 'active': true },
   { 'user': 'fred', 'age': 40, 'active': false },
   { 'user': 'pebbles', 'age': 1, 'active': true }
];

console.log(users.findObj(['active', false]))
// => { 'user': 'fred', 'age': 40, 'active': false }

Using a single level value:

const users = [
   { 'user': 'barney', 'age': 36, 'active': true },
   { 'user': 'fred', 'age': 40, 'active': false },
   { 'user': 'pebbles', 'age': 1, 'active': true }
];

console.log(users.findObj('active'))
// => { 'user': 'barney', 'age': 36, 'active': true }

Array.diff()

Find the difference between two arrays, empty if no difference

const arr1 = [1,2,3]
const arr2 = [1]

console.log(arr1.diff(arr2))
// => [2,3]

Array.shuffle()

Using the current array, shuffle the values and return new array (Doesn't mutate original).

   const arr = [1,2,3,4]
   console.log(arr.shuffle())
   // => [2,3,1,4]

Array.deepEqual()

Check the equality between two arrays returning a boolean

   const arr1 = [1,2,false, 'boo']
   const arr2 = [1,2,false, 'boo']
   
   console.log(arr1.deepEqual(arr2))
   // => true

String Methods

String.camelCase()

Turn a string into camel case: I.E - 'Brandon Dring' -> 'brandonDring'

const str =  'Brandon Dring'

console.log(str.camelCase())
// => 'brandonDring'

String.numberize()

Add appropriate commas to a whole number (No decimals)

const str = '1000000'
console.log(str.numberize())
// => '1,000,000'

String.HTMLescape()

Escape a string ready for HTML insertion: Jekyll & Hyde -> Jekyll & Hyde

   const str = 'Jekyll & Hyde'

   console.log(str.HTMLescape())
   // => 'Jekyll &amp; Hyde'

String.startCase()

Capitalize the first letter in every word of the string (good for names)

const str = 'brandon dring'
console.log(str.startCase())
// => 'Brandon Dring'

String.contains()

Check to see if a given value is within a string

const str = 'The quick brown fox jumps over the lazy dog'

console.log(str.contains('fox'))
// => true

String.isString()

Check to see if the value is a string (On the actual String object)

const str = 'Hello world!'

console.log(String.isString(str))
// => true

Number Methods

Number.round()

Round a number to a decimal place


const num = 1.23456

console.log(num.round())

// => 1

console.log(num.round(2))
// => 1.23

Number.random()

Generate a random number between the two parameters


console.log(Number.random(0,5))
// => Between 0-5

Number.isNumber()

Check to see if the value is a number or not (On the Number object not prototype chain)

const num = 12345


console.log(Number.isNumber(num))
// => true

Contributing

Please feel free to add an issue, or create a pull request to add extra functionality to the prototype chain. However, I don't want to pollute the chain with the entire library of lodash persay, just the most useful functions.

Ackowledgements

CDK Global's annual hackathon for giving me the time to work on this.

prototypes for the general idea.

Lodash for their library to solve common issues