util.js - Zirak/SO-ChatBot GitHub Wiki

source/util.js is a mush of utility functions which extend native objects and their prototypes. This is their stories.

(Note on notation: Foo..bar means Foo.prototype.bar)

Object.merge(...args)

Shallow, non-mutative merge of the arguments.

var o0 = { a : 4, b : 5 },
    o1 = { a : 6, c : 7 };
Object.merge(o0, o1);
// { a : 6, b : 5, c : 7 }
// o0.a === 4

Object.iterate(obj, cb, thisArg)

Iterates over obj, calling cb.call(thisArg, key, value, obj).

var o = { a : 4, b : 5 };
Object.iterate(o, function (key, val, obj) {
    console.log(arguments);
});
// ["a", 4, { a : 4, b : 5}]
// ["b", 5, { a : 4, b : 5}]

Object.TruthMap(values)

Constructs a Truth Map, an object where each item in value is a key corresponding to true. Useful when making whitelists, blacklists, etc.

Object.TruthMap(['foo', 'bar']);
// { foo : true, bar : true }

Array.from(arrayLike)

Transforms arrayLike into a real array. Useful for NodeLists and arguments.

Array.from(document.getElementsByTagName('p')).map(...);

Array..invoke(funName, ...args)

Goes over each item in the array, invoking each item's function funName with args as arguments. If no such function exists on an item, it returns the item unchanged.

['hello', 'world'].invoke('toUpperCase');
// ['HELLO', 'WORLD']
[4, 9.482, Math.E].invoke('toFixed', 4)
// ['4.0000', '9.4820', '2.7183']

Array..first(cb)

Returns the first item in the array to pass cb. I believe this is the ES6 equivalent of Array..find.

Array..random()

Returns a random array item.

Array.forEach, Array.map, Array.filter, Array.reduce

ES5 does not define generic array methods on the Array object. Firefox does. Firefox was smarter.

Array.forEach('abc', console.log.bind(console));
// 'a' 0 'abc'
// 'b' 1 'abc'
// 'c' 2 'abc'

String..indexesOf(needle, startIndex)

Take a guess. Returns all indexes of needle. Did you guess?

String..supplant(obj)

String..supplant(...values)

A copy of Crockford's supplant (look for it in http://javascript.crockford.com/remedial.html), with the addition of a second overload which acts as if you supplied an array.

var data = { food : 'chicken finger', status : 'always missing' };
'{food}s are {status}'.supplant(data);
// 'chicken fingers are always missing'
'{0} and {1} sitting in a tree, K-I-L-L-I-N-G'.supplant('Tommy', 'Grim Reaper');
// 'Tommy and Grim Reaper sitting in a tree, K-I-L-L-I-N-G'

String..startsWith(needle)

Returns whether the subjects...wait for it..starts with needle.

Function..throttle(time)

Returns a function which, when called, will execute after time milliseconds. If called more than once within that span, the timer is reset.

Function..memoize()

Function memoizer. Do I have to explain everything around here!?

Function..memoizeAsync()

Uh, why is this here? Did I even test it?

Number..maxDecimal(places)

Returns the number with at most places digits after the dot.

Number..fallAfter(ranges)

This can probably be removed. Given that ranges is an ordered array of numbers, returns the number after which you can insert this without disrupting order.

4 .fallsAfter( [1, 2, 5] )
// 2
4 .fallsAfter( [0, 3] )
// 3

Math.ratio(a, b)

Returns the ratio a:b in string form. Uses gcd, described just below. Can probably be removed.

Math.gcd(a, b)

Returns the greatest common denominator using the Euclidean method. Can probably be removed.

Math.rand(min, max)

Returns a random number between min and max, inclusive.

Math.rand(max)

Equivalent to Math.rand(0, max)

Math.rand()

Equivalent to Math.rand(0, 9)

RegExp..toJSON()

RegExps are not proper JSON values, when you try and JSON.stringify them, it won't work. But now it will.

RegExp.escape(subject)

Escapes any special regexp characters in subject, so you can pass it into the RegExp constructor without fear.

Date.timeSince(before, after)

Returns the biggest whole interval between before and after, the largest unit being a year. If the difference between the two dates is 2 days and 4 hours, the function will return '2 days'.

Date.timeSince(before)

Equivalent to Date.timeSince(before, new Date())