UNPKG

universe

Version:

The fastest way to query and explore multivariate datasets

319 lines (288 loc) 5.57 kB
/* eslint no-prototype-builtins: 0 */ 'use strict' module.exports = { assign: assign, find: find, remove: remove, isArray: isArray, isObject: isObject, isBoolean: isBoolean, isString: isString, isNumber: isNumber, isFunction: isFunction, get: get, set: set, map: map, keys: keys, sortBy: sortBy, forEach: forEach, isUndefined: isUndefined, pick: pick, xor: xor, clone: clone, isEqual: isEqual, replaceArray: replaceArray, uniq: uniq, flatten: flatten, sort: sort, values: values, recurseObject: recurseObject, } function assign(out) { out = out || {} for (var i = 1; i < arguments.length; i++) { if (!arguments[i]) { continue } for (var key in arguments[i]) { if (arguments[i].hasOwnProperty(key)) { out[key] = arguments[i][key] } } } return out } function find(a, b) { return a.find(b) } function remove(a, b) { return a.filter(function (o, i) { var r = b(o) if (r) { a.splice(i, 1) return true } return false }) } function isArray(a) { return Array.isArray(a) } function isObject(d) { return typeof d === 'object' && !isArray(d) } function isBoolean(d) { return typeof d === 'boolean' } function isString(d) { return typeof d === 'string' } function isNumber(d) { return typeof d === 'number' } function isFunction(a) { return typeof a === 'function' } function get(a, b) { if (isArray(b)) { b = b.join('.') } return b .replace('[', '.').replace(']', '') .split('.') .reduce( function (obj, property) { return obj[property] }, a ) } function set(obj, prop, value) { if (typeof prop === 'string') { prop = prop .replace('[', '.').replace(']', '') .split('.') } if (prop.length > 1) { var e = prop.shift() assign(obj[e] = Object.prototype.toString.call(obj[e]) === '[object Object]' ? obj[e] : {}, prop, value) } else { obj[prop[0]] = value } } function map(a, b) { var m var key if (isFunction(b)) { if (isObject(a)) { m = [] for (key in a) { if (a.hasOwnProperty(key)) { m.push(b(a[key], key, a)) } } return m } return a.map(b) } if (isObject(a)) { m = [] for (key in a) { if (a.hasOwnProperty(key)) { m.push(a[key]) } } return m } return a.map(function (aa) { return aa[b] }) } function keys(obj) { return Object.keys(obj) } function sortBy(a, b) { if (isFunction(b)) { return a.sort(function (aa, bb) { if (b(aa) > b(bb)) { return 1 } if (b(aa) < b(bb)) { return -1 } // a must be equal to b return 0 }) } } function forEach(a, b) { if (isObject(a)) { for (var key in a) { if (a.hasOwnProperty(key)) { b(a[key], key, a) } } return } if (isArray(a)) { return a.forEach(b) } } function isUndefined(a) { return typeof a === 'undefined' } function pick(a, b) { var c = {} forEach(b, function (bb) { if (typeof a[bb] !== 'undefined') { c[bb] = a[bb] } }) return c } function xor(a, b) { var unique = [] forEach(a, function (aa) { if (b.indexOf(aa) === -1) { return unique.push(aa) } }) forEach(b, function (bb) { if (a.indexOf(bb) === -1) { return unique.push(bb) } }) return unique } function clone(a) { return JSON.parse(JSON.stringify(a, function replacer(key, value) { if (typeof value === 'function') { return value.toString() } return value })) } function isEqual(x, y) { if ((typeof x === 'object' && x !== null) && (typeof y === 'object' && y !== null)) { if (Object.keys(x).length !== Object.keys(y).length) { return false } for (var prop in x) { if (y.hasOwnProperty(prop)) { if (!isEqual(x[prop], y[prop])) { return false } } return false } return true } else if (x !== y) { return false } return true } function replaceArray(a, b) { var al = a.length var bl = b.length if (al > bl) { a.splice(bl, al - bl) } else if (al < bl) { a.push.apply(a, new Array(bl - al)) } forEach(a, function (val, key) { a[key] = b[key] }) return a } function uniq(a) { var seen = new Set() return a.filter(function (item) { var allow = false if (!seen.has(item)) { seen.add(item) allow = true } return allow }) } function flatten(aa) { var flattened = [] for (var i = 0; i < aa.length; ++i) { var current = aa[i] for (var j = 0; j < current.length; ++j) { flattened.push(current[j]) } } return flattened } function sort(arr) { for (var i = 1; i < arr.length; i++) { var tmp = arr[i] var j = i while (arr[j - 1] > tmp) { arr[j] = arr[j - 1] --j } arr[j] = tmp } return arr } function values(a) { var values = [] for (var key in a) { if (a.hasOwnProperty(key)) { values.push(a[key]) } } return values } function recurseObject(obj, cb) { _recurseObject(obj, []) return obj function _recurseObject(obj, path) { for (var k in obj) { // eslint-disable-line guard-for-in var newPath = clone(path) newPath.push(k) if (typeof obj[k] === 'object' && obj[k] !== null) { _recurseObject(obj[k], newPath) } else { if (!obj.hasOwnProperty(k)) { continue } cb(obj[k], k, newPath) } } } }