课程名称: 数据可视化入门到精通-打造前端差异化竞争力
课程章节: 数据大盘+vue-element-admin集成+部署【商业级可视化项目】
主讲老师: Sam
今天学习的内容包括:
销售大盘地图组件开发
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } var asyncToGenerator = _asyncToGenerator; function debounce(delay, callback) { var task; return function () { var _arguments = arguments, _this = this; clearTimeout(task); task = setTimeout(function () { callback.apply(_this, _arguments); }, delay); }; } var script$4 = { name: 'ImoocContainer', props: { options: Object }, setup: function setup(ctx) { var refName = 'imoocContainer'; var width = ref(0); var height = ref(0); var originalWidth = ref(0); var originalHeight = ref(0); var ready = ref(false); var context, dom, observer; var initSize = function initSize() { return new Promise(function (resolve) { nextTick(function () { dom = context.$refs[refName]; // 获取大屏的真实尺寸 if (ctx.options && ctx.options.width && ctx.options.height) { width.value = ctx.options.width; height.value = ctx.options.height; } else { width.value = dom.clientWidth; height.value = dom.clientHeight; } // 获取画布尺寸 if (!originalWidth.value || !originalHeight.value) { originalWidth.value = window.screen.width; originalHeight.value = window.screen.height; } // console.log(width.value, height.value, originalWidth.value, originalHeight.value) resolve(); }); }); }; var updateSize = function updateSize() { if (width.value && height.value) { dom.style.width = "".concat(width.value, "px"); dom.style.height = "".concat(height.value, "px"); } else { dom.style.width = "".concat(originalWidth.value, "px"); dom.style.height = "".concat(originalHeight.value, "px"); } }; var updateScale = function updateScale() { // 获取真实的视口尺寸 var currentWidth = document.body.clientWidth; var currentHeight = document.body.clientHeight; // 获取大屏最终的宽高 var realWidth = width.value || originalWidth.value; var realHeight = height.value || originalHeight.value; // console.log(currentWidth, currentHeight) var widthScale = currentWidth / realWidth; var heightScale = currentHeight / realHeight; dom && (dom.style.transform = "scale(".concat(widthScale, ", ").concat(heightScale, ")")); }; var onResize = /*#__PURE__*/function () { var _ref = asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(e) { return regenerator.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return initSize(); case 2: updateScale(); case 3: case "end": return _context.stop(); } } }, _callee); })); return function onResize(_x) { return _ref.apply(this, arguments); }; }(); var initMutationObserver = function initMutationObserver() { var MutationObserver = window.MutationObserver; observer = new MutationObserver(onResize); observer.observe(dom, { attributes: true, attributeFilter: ['style'], attributeOldValue: true }); }; var removeMutationObserver = function removeMutationObserver() { if (observer) { observer.disconnect(); observer.takeRecords(); observer = null; } }; onMounted( /*#__PURE__*/asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() { return regenerator.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: ready.value = false; context = getCurrentInstance().ctx; _context2.next = 4; return initSize(); case 4: updateSize(); updateScale(); window.addEventListener('resize', debounce(100, onResize)); initMutationObserver(); ready.value = true; case 9: case "end": return _context2.stop(); } } }, _callee2); }))); onUnmounted(function () { window.removeEventListener('resize', onResize); removeMutationObserver(); }); return { refName: refName, ready: ready }; } }; function render$4(_ctx, _cache) { return (openBlock(), createBlock("div", { id: "imooc-container", ref: _ctx.refName }, [ (_ctx.ready) ? renderSlot(_ctx.$slots, "default", { key: 0 }) : createCommentVNode("v-if", true) ], 512 /* NEED_PATCH */)) } var css_248z$4 = "#imooc-container {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n transform-origin: left top;\n z-index: 999;\n}"; styleInject(css_248z$4); script$4.render = render$4; script$4.__file = "src/components/Container/Container.vue"; function Container (Vue) { Vue.component(script$4.name, script$4); } // // // // // // // // // // // // // // // // // // // // // // // // // var script$5 = { name: 'ImoocLogo', props: { strokeWidth: { type: [String, Number], "default": 1 }, stroke: { type: String, "default": '#000' } } }; const _withId$3 = /*#__PURE__*/withScopeId("data-v-46aab5e5"); pushScopeId("data-v-46aab5e5"); const _hoisted_1$4 = { class: "imooc-logo", viewBox: "0 0 1082 1024" }; popScopeId(); const render$5 = /*#__PURE__*/_withId$3(function render(_ctx, _cache) { return (openBlock(), createBlock("svg", _hoisted_1$4, [ createVNode("path", { stroke: _ctx.stroke, "stroke-width": _ctx.strokeWidth, class: "imooc-logo1", d: "M533.767 0l158.995 304.74s-278.24 164.672-442.914 444.805l13.25-92.746L0.076 389.915l367.201-41.641z" }, null, 8 /* PROPS */, ["stroke", "stroke-width"]), createVNode("path", { stroke: _ctx.stroke, "stroke-width": _ctx.strokeWidth, class: "imooc-logo1", d: "M232.813 819.351s384.237-577.074 849.94-433.222l-60.57 66.248s-253.634-24.606-388.022 71.926c0 0-264.991 132.496-401.272 310.418z" }, null, 8 /* PROPS */, ["stroke", "stroke-width"]), createVNode("path", { stroke: _ctx.stroke, "stroke-width": _ctx.strokeWidth, class: "imooc-logo1", d: "M902.861 564.052l-81.39 79.497s-278.24 11.357-588.658 240.384c0 0 300.954-359.857 670.048-319.881z" }, null, 8 /* PROPS */, ["stroke", "stroke-width"]), createVNode("path", { stroke: _ctx.stroke, "stroke-width": _ctx.strokeWidth, class: "imooc-logo1", d: "M223.35 921.79s321.774-217.672 611.37-179.816L868.792 1024 546.108 849.863l-341.61 173.91z" }, null, 8 /* PROPS */, ["stroke", "stroke-width"]) ])) }); var css_248z$5 = ".imooc-logo[data-v-46aab5e5] {\n width: 100%;\n height: 100%;\n}\n\n.imooc-logo1[data-v-46aab5e5] {\n fill: none;\n animation: imooc-logo-animation-data-v-46aab5e5 5s linear infinite forwards;\n}\n\n@keyframes imooc-logo-animation-data-v-46aab5e5 {\n 0% {\n stroke-dasharray: 2202;\n stroke-dashoffset: 2202;\n }\n 50% {\n stroke-dasharray: 2202;\n stroke-dashoffset: 0;\n }\n 100% {\n stroke-dasharray: 2202;\n stroke-dashoffset: 0;\n }\n}"; styleInject(css_248z$5); script$5.render = render$5; script$5.__scopeId = "data-v-46aab5e5"; script$5.__file = "src/components/ImoocLogo/ImoocLogo.vue"; function ImoocLogo (Vue) { Vue.component(script$5.name, script$5); } var lastTime = 0; var prefixes = 'webkit moz ms o'.split(' '); // 各浏览器前缀 var requestAnimationFrame; var cancelAnimationFrame; var isServer = typeof window === 'undefined'; if (isServer) { requestAnimationFrame = function requestAnimationFrame() {}; cancelAnimationFrame = function cancelAnimationFrame() {}; } else { requestAnimationFrame = window.requestAnimationFrame; cancelAnimationFrame = window.cancelAnimationFrame; var prefix; // 通过遍历各浏览器前缀,来得到requestAnimationFrame和cancelAnimationFrame在当前浏览器的实现形式 for (var i = 0; i < prefixes.length; i++) { if (requestAnimationFrame && cancelAnimationFrame) { break; } prefix = prefixes[i]; requestAnimationFrame = requestAnimationFrame || window[prefix + 'RequestAnimationFrame']; cancelAnimationFrame = cancelAnimationFrame || window[prefix + 'CancelAnimationFrame'] || window[prefix + 'CancelRequestAnimationFrame']; } // 如果当前浏览器不支持requestAnimationFrame和cancelAnimationFrame,则会退到setTimeout if (!requestAnimationFrame || !cancelAnimationFrame) { requestAnimationFrame = function requestAnimationFrame(callback) { var currTime = new Date().getTime(); // 为了使setTimteout的尽可能的接近每秒60帧的效果 var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function () { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; cancelAnimationFrame = function cancelAnimationFrame(id) { window.clearTimeout(id); }; } } // var script$6 = { name: 'CountTo', props: { startVal: { type: Number, required: false, "default": 0 }, endVal: { type: Number, required: false, "default": 2017 }, duration: { type: Number, required: false, "default": 3000 }, autoplay: { type: Boolean, required: false, "default": true }, decimals: { type: Number, required: false, "default": 0, validator: function validator(value) { return value >= 0; } }, decimal: { type: String, required: false, "default": '.' }, separator: { type: String, required: false, "default": ',' }, prefix: { type: String, required: false, "default": '' }, suffix: { type: String, required: false, "default": '' }, useEasing: { type: Boolean, required: false, "default": true }, easingFn: { type: Function, "default": function _default(t, b, c, d) { return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b; } } }, data: function data() { return { localStartVal: this.startVal, displayValue: this.formatNumber(this.startVal), printVal: null, paused: false, localDuration: this.duration, startTime: null, timestamp: null, remaining: null, rAF: null }; }, computed: { countDown: function countDown() { return this.startVal > this.endVal; } }, watch: { startVal: function startVal() { if (this.autoplay) { this.start(); } }, endVal: function endVal() { if (this.autoplay) { this.start(); } } }, mounted: function mounted() { if (this.autoplay) { this.start(); } /* eslint-disable */ this.$emit('mountedCallback'); }, methods: { start: function start() { this.localStartVal = this.startVal; this.startTime = null; this.localDuration = this.duration; this.paused = false; this.rAF = requestAnimationFrame(this.count); }, pauseResume: function pauseResume() { if (this.paused) { this.resume(); this.paused = false; } else { this.pause(); this.paused = true; } }, pause: function pause() { cancelAnimationFrame(this.rAF); }, resume: function resume() { this.startTime = null; this.localDuration = +this.remaining; this.localStartVal = +this.printVal; requestAnimationFrame(this.count); }, reset: function reset() { this.startTime = null; cancelAnimationFrame(this.rAF); this.displayValue = this.formatNumber(this.startVal); }, count: function count(timestamp) { if (!this.startTime) this.startTime = timestamp; this.timestamp = timestamp; var progress = timestamp - this.startTime; this.remaining = this.localDuration - progress; if (this.useEasing) { if (this.countDown) { this.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration); } else { this.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration); } } else { if (this.countDown) { this.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration); } else { this.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration); } } if (this.countDown) { this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal; } else { this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal; } this.displayValue = this.formatNumber(this.printVal); if (progress < this.localDuration) { this.rAF = requestAnimationFrame(this.count); } else { this.$emit('callback'); } }, isNumber: function isNumber(val) { return !isNaN(parseFloat(val)); }, formatNumber: function formatNumber(num) { num = num.toFixed(this.decimals); num += ''; var x = num.split('.'); var x1 = x[0]; var x2 = x.length > 1 ? this.decimal + x[1] : ''; var rgx = /(\d+)(\d{3})/; if (this.separator && !this.isNumber(this.separator)) { while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + this.separator + '$2'); } } return this.prefix + x1 + x2 + this.suffix; } }, destroyed: function destroyed() { cancelAnimationFrame(this.rAF); } }; function render$6(_ctx, _cache) { return (openBlock(), createBlock("span", null, toDisplayString(_ctx.displayValue), 1 /* TEXT */)) } script$6.render = render$6; script$6.__file = "src/components/VueCountTo/vue-countTo.vue"; function VueCountTo (Vue) { Vue.component(script$6.name, script$6); } // var script$7 = { name: 'VueEcharts', props: { options: Object, theme: [String, Object] }, setup: function setup(ctx) { var dom; var chart; var className = "echarts".concat(v4()); var initChart = function initChart() { if (!chart) { dom = document.getElementsByClassName(className)[0]; chart = Echarts.init(dom, ctx.theme); } if (ctx.options) { chart.setOption(ctx.options); } }; onMounted(function () { initChart(); }); watch(function () { return ctx.options; }, function () { initChart(); }); return { className: className }; } }; const _withId$4 = /*#__PURE__*/withScopeId("data-v-38cd74e2"); const render$7 = /*#__PURE__*/_withId$4(function render(_ctx, _cache) { return (openBlock(), createBlock("div", { class: [_ctx.className, 'echarts'] }, null, 2 /* CLASS */)) }); var css_248z$6 = ".echarts[data-v-38cd74e2] {\n width: 100%;\n height: 100%;\n}"; styleInject(css_248z$6); script$7.render = render$7; script$7.__scopeId = "data-v-38cd74e2"; script$7.__file = "src/components/VueEcharts/VueEcharts.vue"; function VueEcharts (Vue) { Vue.component(script$7.name, script$7); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var arrayLikeToArray = _arrayLikeToArray; function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return arrayLikeToArray(arr); } var arrayWithoutHoles = _arrayWithoutHoles; function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } var iterableToArray = _iterableToArray; function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); } var unsupportedIterableToArray = _unsupportedIterableToArray; function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var nonIterableSpread = _nonIterableSpread; function _toConsumableArray(arr) { return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); } var toConsumableArray = _toConsumableArray; function useScreen(id) { var width = ref(0); var height = ref(0); var dom; onMounted(function () { dom = document.getElementById(id); width.value = dom.clientWidth; height.value = dom.clientHeight; }); return { width: width, height: height }; } /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } var _listCacheClear = listCacheClear; /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } var eq_1 = eq; /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq_1(array[length][0], key)) { return length; } } return -1; } var _assocIndexOf = assocIndexOf; /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = _assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } var _listCacheDelete = listCacheDelete; /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = _assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } var _listCacheGet = listCacheGet; /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return _assocIndexOf(this.__data__, key) > -1; } var _listCacheHas = listCacheHas; /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = _assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } var _listCacheSet = listCacheSet; /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `ListCache`. ListCache.prototype.clear = _listCacheClear; ListCache.prototype['delete'] = _listCacheDelete; ListCache.prototype.get = _listCacheGet; ListCache.prototype.has = _listCacheHas; ListCache.prototype.set = _listCacheSet; var _ListCache = ListCache; /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new _ListCache; this.size = 0; } var _stackClear = stackClear; /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } var _stackDelete = stackDelete; /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } var _stackGet = stackGet; /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } var _stackHas = stackHas; /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; var _freeGlobal = freeGlobal; /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = _freeGlobal || freeSelf || Function('return this')(); var _root = root; /** Built-in value references. */ var Symbol$1 = _root.Symbol; var _Symbol = Symbol$1; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } var _getRawTag = getRawTag; /** Used for built-in method references. */ var objectProto$1 = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString$1 = objectProto$1.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString$1.call(value); } var _objectToString = objectToString; /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag$1 && symToStringTag$1 in Object(value)) ? _getRawTag(value) : _objectToString(value); } var _baseGetTag = baseGetTag; /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } var isObject_1 = isObject; /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject_1(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = _baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } var isFunction_1 = isFunction; /** Used to detect overreaching core-js shims. */ var coreJsData = _root['__core-js_shared__']; var _coreJsData = coreJsData; /** Used to detect methods masquerading as native. */ var maskSrcKey = (function() { var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || ''); return uid ? ('Symbol(src)_1.' + uid) : ''; }()); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && (maskSrcKey in func); } var _isMasked = isMasked; /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } var _toSource = toSource; /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto$1 = Function.prototype, objectProto$2 = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString$1 = funcProto$1.toString; /** Used to check objects for own properties. */ var hasOwnProperty$1 = objectProto$2.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject_1(value) || _isMasked(value)) { return false; } var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; return pattern.test(_toSource(value)); } var _baseIsNative = baseIsNative; /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } var _getValue = getValue; /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = _getValue(object, key); return _baseIsNative(value) ? value : undefined; } var _getNative = getNative; /* Built-in method references that are verified to be native. */ var Map = _getNative(_root, 'Map'); var _Map = Map; /* Built-in method references that are verified to be native. */ var nativeCreate = _getNative(Object, 'create'); var _nativeCreate = nativeCreate; /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; this.size = 0; } var _hashClear = hashClear; /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } var _hashDelete = hashDelete; /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto$3 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$2 = objectProto$3.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (_nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty$2.call(data, key) ? data[key] : undefined; } var _hashGet = hashGet; /** Used for built-in method references. */ var objectProto$4 = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty$3 = objectProto$4.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key); } var _hashHas = hashHas; /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value; return this; } var _hashSet = hashSet; /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `Hash`. Hash.prototype.clear = _hashClear; Hash.prototype['delete'] = _hashDelete; Hash.prototype.get = _hashGet; Hash.prototype.has = _hashHas; Hash.prototype.set = _hashSet; var _Hash = Hash; /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { 'hash': new _Hash, 'map': new (_Map || _ListCache), 'string': new _Hash }; } var _mapCacheClear = mapCacheClear; /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } var _isKeyable = isKeyable; /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return _isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } var _getMapData = getMapData; /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = _getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } var _mapCacheDelete = mapCacheDelete; /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return _getMapData(this, key).get(key); } var _mapCacheGet = mapCacheGet; /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return _getMapData(this, key).has(key); } var _mapCacheHas = mapCacheHas; /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = _getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } var _mapCacheSet = mapCacheSet; /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `MapCache`. MapCache.prototype.clear = _mapCacheClear; MapCache.prototype['delete'] = _mapCacheDelete; MapCache.prototype.get = _mapCacheGet; MapCache.prototype.has = _mapCacheHas; MapCache.prototype.set = _mapCacheSet; var _MapCache = MapCache; /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof _ListCache) { var pairs = data.__data__; if (!_Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new _MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } var _stackSet = stackSet; /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new _ListCache(entries); this.size = data.size; } // Add methods to `Stack`. Stack.prototype.clear = _stackClear; Stack.prototype['delete'] = _stackDelete; Stack.prototype.get = _stackGet; Stack.prototype.has = _stackHas; Stack.prototype.set = _stackSet; var _Stack = Stack; /** * A specialized version of `_.forEach` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns `array`. */ function arrayEach(array, iteratee) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (iteratee(array[index], index, array) === false) { break; } } return array; } var _arrayEach = arrayEach; var defineProperty = (function() { try { var func = _getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); var _defineProperty = defineProperty; /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == '__proto__' && _defineProperty) { _defineProperty(object, key, { 'configurable': true, 'enumerable': true, 'value': value, 'writable': true }); } else { object[key] = value; } } var _baseAssignValue = baseAssignValue;