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

object-loops

v0.8.0

Published

Functional methods like forEach, map, filter, and other Array methods for Objects in javascript

Downloads

6,519

Readme

object-loops Build Status

Functional methods like forEach, map, filter, and other Array methods for Objects in javascript

Installation

npm install object-loops

Index

chain

every

inverse

filter

findKey

find

forEach

keys

keysIn

mapKeys

map

reduce

some

values

valuesIn

Usage

You can require each method individually object-loops/<loop>

var filter = require('object-loops/filter')
var forEach = require('object-loops/for-each')
var mapKeys = require('object-loops/map-keys')
var map = require('object-loops/map')
var reduce = require('object-loops/reduce')
//... and more
// usage
forEach({ x:10, y: 20 }, callback)
filter({ x:10, y: 20 }, callback)
mapKeys({ x:10, y: 20 }, callback)
map({ x:10, y: 20 }, callback)
reduce({ x:10, y: 20 }, callback)

If you want to chain multiple object-loops use object-loops/chain

var chain = require('object-loops/chain')
chain({ x:10, y: 20 })
  .filter(callback)
  .mapKeys(callback)
  .map(callback)
  .reduce(callback)
  .toJSON() // must be called at the end to return modified object

If you want to use forEach, map, reduce, filter, etc methods directly on objects:

require('object-loops')() // extends Object.prototype
obj.forEach(callback)
obj.filter(callback)
obj.mapKeys(callback)
obj.map(callback)
obj.reduce(callback)

every

Tests whether every value in the object passes the test implemented by the callback.

  • @function module:object-loops/every
  • @param {object} [obj] - object to iterate through, not accepted if being used directly on Object.prototype
  • @param {everyCallback} callback - function to test each value in the object. return falsey to end the loop, truthy otherwise.
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {boolean} if callback returns false, the loop is ended and false is returned (else false)
var every = require('object-loops/every')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30,
  qux: 40,
}
var allGreaterThan25 = every(obj, function (val, key, obj) {
  return val > 25
})
allGreaterThan25 // false
*/

inverse

Creates a new object with keys and values flipped.

  • @param {object} [obj] - object to inverse keys and values, not accepted if being used directly on Object.prototype
  • @returns {object} newly created object with inversed values
var inverse = require('object-loops/inverse')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30
}
var inversedObj = inverse(obj)
inversedObj /* keys and vals are flipped
{
  '10': 'foo',
  '20': 'bar',
  '30': 'baz'
}
*/

filter

Creates a new object with all entries that pass the test implemented by the provided function.

  • @param {object} [obj] - object to filter values, not accepted if being used directly on Object.prototype
  • @param {function} callback - function to test each value in the object. return true to keep that entry, false otherwise.
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {object} newly created object with filtered values
var filter = require('object-loops/filter')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30,
  qux: 40,
}
var filteredObj = filter(obj, function (val, key, obj) {
  return val > 25
})
filteredObj /* Only has entries with vals greater than 25
{
  baz: 30,
  qux: 40
}
*/

find

Find the value of the the object that passes the test implemented by the callback.

  • @param {object} [obj] - object to iterate through, not accepted if being used directly on Object.prototype
  • @param {findCallback} callback - function to test each value in the object. return truthy to end the loop and return index, falsey otherwise.
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {*} if callback returns true, the loop is ended and the passing val is returned (else undefined)
var find = require('object-loops/find')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30,
  qux: 40,
}
var key = find(obj, function (val, key, obj) {
  return val > 25
})
key // 30
var notfound = find(obj, function (val, key, obj) {
  return val > 100
})
notfound // undefined
*/

findKey

Find the key of the the object that passes the test implemented by the callback. Very similar to Array.prototype.findIndex

  • @param {object} [obj] - object to iterate through, not accepted if being used directly on Object.prototype
  • @param {findKeyCallback} callback - function to test each value in the object. return truthy to end the loop and return index, falsey otherwise.
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {*} if callback returns true, the loop is ended and the passing key is returned (else undefined)
var findKey = require('object-loops/find-key')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30,
  qux: 40,
}
var key = findKey(obj, function (val, key, obj) {
  return val > 25
})
key // 'baz'
var notfound = findKey(obj, function (val, key, obj) {
  return val > 100
})
notfound // undefined
*/

forEach

Executes a provided function once per each object value.

  • @param {object} [obj] - object to forEach, not accepted if being used directly on Object.prototype
  • @param {function} callback - function that will be invoked once for each key-value pair
  • @param {*} [thisArg] - optional. context to bind to callback
var forEach = require('object-loops/for-each')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30
}
var keyConcat = ''
var valSum = 0
forEach(obj, function (val, key, obj) {
  keyConcat += key
  valSum += val
})
keyConcat // = 'foobarbaz'
valSum    // = 60

keys

Equivalent to Object.keys. Implemented specifically for chain.

var chain = require('object-loops/chain')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30
}
chain(obj)
  .keys()
  .toJSON()
// ['foo', 'bar', 'baz']

keysIn

Like to keys, but includes enumerable keys from the prototype chain.

var keysIn = require('object-loops/keys-in')

function Person (name) {
  this.name = name
}
Person.prototype.getName = function () {
  return this.name
}

var person = new Person('foo')
keysIn(obj)
// ['name', 'getName']
// for comparison, `keys` would return ['name']

mapKeys

Creates a new object with the results of calling a provided function on every key in the object.

  • @param {object} [obj] - object to map keys, not accepted if being used directly on Object.prototype
  • @param {mapKeysCallback} callback - function that produces the new key for the new mapped object
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {object} newly created object with mapped keys
var mapKeys = require('object-loops/map-keys')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30
}
var mappedObj = mapKeys(obj, function (key, val, obj) {
  return key + 'New'
})
mappedObj /* Each key is concated w/ 'New'
{
  fooNew: 10,
  barNew: 20,
  bazNew: 30
}
*/

map

Creates a new object with the results of calling a provided function on every value in the object.

  • @param {object} [obj] - object to map values, not accepted if being used directly on Object.prototype
  • @param {function} callback - function that produces the new value for the new, mapped object
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {object} newly created object with mapped values
var map = require('object-loops/map')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30
}
var mappedObj = map(obj, function (val, key, obj) {
  return val*2
})
mappedObj /* Each val multiplied by 2
{
  foo: 20,
  bar: 40,
  baz: 60
}
*/

reduce

Applies a function against an accumulator and each value of the object to reduce it to a single value.

  • @param {object} [obj] - object to reduce values, not accepted if being used directly on Object.prototype
  • @param {function} callback - function to test each value in the object. return true to keep that entry, false otherwise.
  • @param {*} [initialValue] - optional. object to use as the first argument to the first call of the callback
  • @returns {*} finalValue - final value returned by reduction, or just first val if only one exists.
var reduce = require('object-loops/reduce')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30
}
var sum = reduce(obj, function (prevVal, val, key, obj) {
  return prevVal + val
})
sum // 60

some

Tests whether some value in the object passes the test implemented by the callback.

  • @function module:object-loops/some
  • @param {object} [obj] - object to iterate through, not accepted if being used directly on Object.prototype
  • @param {someCallback} callback - function to test each value in the object. return truthy to end the loop, falsey otherwise.
  • @param {*} [thisArg] - optional. context to bind to callback
  • @returns {boolean} if callback returns true, the loop is ended and true is returned (else false)
var some = require('object-loops/some')

var obj = {
  foo: 10,
  bar: 20,
  baz: 30,
  qux: 40,
}
var anyGreaterThan25 = some(obj, function (val, key, obj) {
  return val > 25
})
anyGreaterThan25 // true
*/

values

Like to keys, but returns direct enumerable values.

var values = require('object-loops/values')

function Person (name) {
  this.name = name
}
Person.prototype.getName = function () {
  return this.name
}

var person = new Person('foo')
values(obj)
// ['foo']
// for comparison, `valuesIn` would return ['foo', Person.prototype.getName]

valuesIn

Like to keys, but returns direct enumerable values including prototype chain.

var valuesIn = require('object-loops/values-in')

function Person (name) {
  this.name = name
}
Person.prototype.getName = function () {
  return this.name
}

var person = new Person('foo')
valuesIn(obj)
// ['foo', Person.prototype.getName]

License

MIT