UNPKG

@spalger/kibana

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

129 lines (108 loc) 3.96 kB
define(function (require) { return function (_) { _.mixin(_, { /** * move an obj either up or down in the collection by * injecting it either before/after the prev/next obj that * satisfied the qualifier * * or, just from one index to another... * * @param {array} objs - the list to move the object within * @param {number|any} obj - the object that should be moved, or the index that the object is currently at * @param {number|boolean} below - the index to move the object to, or whether it should be moved up or down * @param {function} qualifier - a lodash-y callback, object = _.where, string = _.pluck * @return {array} - the objs argument */ move: function (objs, obj, below, qualifier) { var origI = _.isNumber(obj) ? obj : objs.indexOf(obj); if (origI === -1) return objs; if (_.isNumber(below)) { // move to a specific index objs.splice(below, 0, objs.splice(origI, 1)[0]); return objs; } below = !!below; qualifier = _.callback(qualifier); var above = !below; var finder = below ? _.findIndex : _.findLastIndex; // find the index of the next/previous obj that meets the qualifications var targetI = finder(objs, function (otherAgg, otherI) { if (below && otherI <= origI) return; if (above && otherI >= origI) return; return !!qualifier(otherAgg, otherI); }); if (targetI === -1) return objs; // place the obj at it's new index objs.splice(targetI, 0, objs.splice(origI, 1)[0]); }, /** * Like _.groupBy, but allows specifying multiple groups for a * single object. * * _.organizeBy([{ a: [1, 2, 3] }, { b: true, a: [1, 4] }], 'a') * // Object {1: Array[2], 2: Array[1], 3: Array[1], 4: Array[1]} * * _.groupBy([{ a: [1, 2, 3] }, { b: true, a: [1, 4] }], 'a') * // Object {'1,2,3': Array[1], '1,4': Array[1]} * * @param {array} collection - the list of values to organize * @param {Function} callback - either a property name, or a callback. * @return {object} */ organizeBy: function (collection, callback) { var buckets = {}; var prop = typeof callback === 'function' ? false : callback; function add(key, obj) { if (!buckets[key]) buckets[key] = []; buckets[key].push(obj); } _.each(collection, function (obj) { var keys = prop === false ? callback(obj) : obj[prop]; if (!_.isArray(keys)) { add(keys, obj); return; } var length = keys.length; while (length-- > 0) { add(keys[length], obj); } }); return buckets; }, /** * Remove or add a value to an array based on it's presense in the * array initially. * * @param {array} arr * @param {any} value - the value to toggle * @return {array} arr */ toggleInOut: function (arr, value) { if (_.contains(arr, value)) { arr.splice(arr.indexOf(value), 1); } else { arr.push(value); } return arr; }, /** * Efficient and safe version of [].push(dest, source); * * @param {Array} source - the array to pull values from * @param {Array} dest - the array to push values into * @return {Array} dest */ pushAll: function (source, dest) { var start = dest.length; var adding = source.length; // allocate - http://goo.gl/e2i0S0 dest.length = start + adding; // fill sparse positions var i = -1; while (++i < adding) dest[start + i] = source[i]; return dest; }, }); }; });