UNPKG

lodash-contrib

Version:

The brass buckles on lodash's utility belt

101 lines (74 loc) 2.79 kB
module.exports = function (_) { // Helpers // ------- // Create quick reference variables for speed access to core prototypes. var concat = Array.prototype.concat; var ArrayProto = Array.prototype; var slice = ArrayProto.slice; // Mixing in the object selectors // ------------------------------ _.mixin({ // Returns a function that will attempt to look up a named field // in any object that it's given. accessor: function(field) { return function(obj) { return (obj && obj[field]); }; }, // Given an object, returns a function that will attempt to look up a field // that it's given. dictionary: function (obj) { return function(field) { return (obj && field && obj[field]); }; }, // Like `_.pick` except that it takes an array of keys to pick. selectKeys: function (obj, ks) { return _.pick.apply(null, concat.call([obj], ks)); }, // Returns the key/value pair for a given property in an object, undefined if not found. kv: function(obj, key) { if (_.has(obj, key)) { return [key, obj[key]]; } return void 0; }, // Gets the value at any depth in a nested object based on the // path described by the keys given. Keys may be given as an array // or as a dot-separated string. getPath: function getPath (obj, ks) { if (typeof ks == "string") ks = ks.split("."); // If we have reached an undefined property // then stop executing and return undefined if (obj === undefined) return void 0; // If the path array has no more elements, we've reached // the intended property and return its value if (ks.length === 0) return obj; // If we still have elements in the path array and the current // value is null, stop executing and return undefined if (obj === null) return void 0; return getPath(obj[_.first(ks)], _.rest(ks)); }, // Returns a boolean indicating whether there is a property // at the path described by the keys given hasPath: function hasPath (obj, ks) { if (typeof ks == "string") ks = ks.split("."); var numKeys = ks.length; if (obj == null && numKeys > 0) return false; if (_.contains(['boolean', 'string', 'number'], typeof obj)) return false; if (!(ks[0] in obj)) return false; if (numKeys === 1) return true; return hasPath(obj[_.first(ks)], _.rest(ks)); }, pickWhen: function(obj, pred) { var copy = {}; _.each(obj, function(value, key) { if (pred(obj[key])) copy[key] = obj[key]; }); return copy; }, omitWhen: function(obj, pred) { return _.pickWhen(obj, function(e) { return !pred(e); }); } }); };