array-sort-by
Version:
Sorts an array and allows specify multiple sorting criteria
1 lines • 14.5 kB
Source Map (JSON)
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap e36f63b6785e7c05fec9","webpack:///./src/ignore-accent.js","webpack:///./src/map-accents.js","webpack:///./src/sort-by.js","webpack:///./src/generate-char-codes.js","webpack:///./src/escapeRegExp.js","webpack:///./src/memoize.js","webpack:///./src/default-sort.js","webpack:///./src/sort-items.js"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","text","_mapAccents","CHARS","accents","forEach","charCode","replace","getPattern","replacements","toUpperCase","default","accent","_escapeRegExp2","String","fromCharCode","RegExp","unshift","apply","_generateCharCodes2","split","_generateCharCodes","Array","sortBy","normalizeString","items","concat","length","_ignoreAccent2","array","parser","item","arrLength","sort","_defaultSort2","_sortItems2","mapAccents","_mapAccents2","charcodes","push","charCodeAt","ESCAPE_CHARS","func","cache","_len","arguments","args","_key","key","JSON","stringify","prev","next","_ignoreAccent","prevItems","nextItems","ordered","comparer","DESC","asc","test"],"mappings":";CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,IACA,mBAAAG,eAAAC,IACAD,UAAAH,GACA,iBAAAC,QACAA,QAAA,OAAAD,IAEAD,EAAA,OAAAC,IARA,CASC,oBAAAK,UAAAC,KAAA,WACD,mBCTA,IAAAC,KAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAR,QAGA,IAAAC,EAAAK,EAAAE,IACAC,EAAAD,EACAE,GAAA,EACAV,YAUA,OANAW,EAAAH,GAAAI,KAAAX,EAAAD,QAAAC,IAAAD,QAAAO,GAGAN,EAAAS,GAAA,EAGAT,EAAAD,QAqCA,OAhCAO,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAf,EAAAgB,EAAAC,GACAV,EAAAW,EAAAlB,EAAAgB,IACAG,OAAAC,eAAApB,EAAAgB,GACAK,cAAA,EACAC,YAAA,EACAC,IAAAN,KAMAV,EAAAiB,EAAA,SAAAvB,GACA,IAAAgB,EAAAhB,KAAAwB,WACA,WAA2B,OAAAxB,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAM,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAQ,EAAAC,GAAsD,OAAAR,OAAAS,UAAAC,eAAAjB,KAAAc,EAAAC,IAGtDpB,EAAAuB,EAAA,GAGAvB,IAAAwB,EAAA,6FC9Ce,SAAsBC,GAKnC,OAJAC,EAAAC,MAAMC,QAAQC,QAAQ,SAACC,EAAU5B,GAC/BuB,EAAOA,EAAKM,QAAQC,EAAWF,GAAWJ,EAAAC,MAAMM,aAAa/B,MAGxDuB,EAAKS,eApBd,IAAAR,EAAA1B,EAAA,OACAA,EAAA,uDAGA,IAAMgC,GAAa,IAFnBhC,EAAA,IAEmBmC,SAAQ,SAACL,GAC1B,IAAMM,GAAS,EAAAC,EAAAF,SAAaG,OAAOC,aAAaT,IAChD,OAAO,IAAIU,OAAOJ,EAAQ,mICgBb,SAAoBR,EAASK,GAC1CQ,EAAQC,MAAMf,EAAMC,SAAS,EAAAe,EAAAR,SAAkBP,IAC/Ca,EAAQC,MAAMf,EAAMM,aAAcA,EAAaW,MAAM,MAxBvD,MAAAC,EAAA7C,EAAA,uCAEA,IAAMyC,EAAUK,MAAMzB,UAAUoB,QAEnBd,WACXC,SACE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvD,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,KAEtBK,aAAc,sDAAsDW,MAAM,8FCwBpDG,EAxBxB,QAAA/C,EAAA,QACAA,EAAA,QACAA,EAAA,QACAA,EAAA,uDAEA,IAAMgD,EAAkB,SAACC,GAEvB,IAAK,IAAI/C,GADT+C,KAAWC,OAAOD,IACCE,OAAS,EAAGjD,GAAK,EAAGA,GAAK,EAClB,iBAAb+C,EAAM/C,KACf+C,EAAM/C,IAAK,EAAAkD,EAAAjB,SAAac,EAAM/C,KAGlC,OAAO+C,GAYM,SAASF,EAAOM,EAAOC,GACpC,IAAIpD,SAAGqD,SACDC,EAAYH,EAAMF,OACxB,GAAsB,mBAAXG,EACT,OAAOD,EAAMI,MAAK,EAAAC,EAAAvB,YAGpB,IAAKjC,EAAIsD,EAAWtD,GAClBqD,EAAOF,EAAMnD,GAAK,GAElBmD,EAAMnD,MAAQgD,OACZF,EAAgBM,EAAOjD,KAAK,KAAMkD,EAAMrD,IACxCqD,GAMJ,IAFAF,EAAMI,KAANE,EAAAxB,SAEKjC,EAAIsD,EAAWtD,GAClBqD,EAAOF,EAAMnD,GAAK,GAClBmD,EAAMnD,GAAKqD,EAAKA,EAAKJ,OAAS,GAEhC,OAAOE,EAGTN,EAAOa,WAAPC,EAAA1B,qHCxDe,SAA2BV,GAExC,IADA,IAAMqC,KACG5D,EAAI,EAAGA,EAAIuB,EAAK0B,OAAQjD,GAAK,EACpC4D,EAAUC,KAAKtC,EAAKuC,WAAW9D,IAEjC,OAAO4D,gHCCM,SAAsBrC,GACnC,OAAOA,EAAKM,QAAQkC,EAAc,SAVpC,IAAMA,EAAe,yICkBN,SAAiBC,GAC9B,IAAMC,KACN,OAAO,WAA2B,QAAAC,EAAAC,UAAAlB,OAANmB,EAAMxB,MAAAsB,GAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAND,EAAMC,GAAAF,UAAAE,GAChC,IAAMC,EAAMC,KAAKC,UAAUJ,GAC3B,OAAIE,KAAOL,EAAcA,EAAMK,IAC/BL,EAAMK,GAAON,eAAQI,GACdH,EAAMK,mHCpBF,WACb,IAAML,KASN,OAAO,SAAcQ,EAAMC,GAOzB,MANoB,iBAATD,IACHA,KAAQR,IAAQA,EAAMQ,IAAQ,EAAAvB,EAAAjB,SAAawC,IAC3CC,KAAQT,IAAQA,EAAMS,IAAQ,EAAAxB,EAAAjB,SAAayC,IACjDD,EAAOR,EAAMQ,GACbC,EAAOT,EAAMS,IAEXD,IAASC,EAAa,EAClBD,EAAOC,EAAO,GAAK,IAzB/B,MAAAC,EAAA7E,EAAA,oJC4Be,SAAmB8E,EAAWC,GAC3C,IAAI7E,SAAG8E,SACP,IAAK9E,KAAK4E,EAER,GADAE,EAAUC,EAASH,EAAU5E,GAAI6E,EAAU7E,IAC9B,OAAO8E,EAEtB,OAAO,GAlCT,IAAME,EAAO,aAYb,SAASD,EAASN,EAAMC,GACtB,IAAIO,EAAM,EAIV,MAHoB,iBAATR,GACLO,EAAKE,KAAKT,KAAOQ,GAAO,GAE1BR,IAASC,EAAa,GAClBD,EAAOC,EAAO,GAAK,GAAKO","file":"sort-by.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sortBy\"] = factory();\n\telse\n\t\troot[\"sortBy\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e36f63b6785e7c05fec9","import {CHARS} from './map-accents';\nimport escapeRegExp from './escapeRegExp';\nimport memoize from './memoize';\n\nconst getPattern = memoize((charCode) => {\n const accent = escapeRegExp(String.fromCharCode(charCode));\n return new RegExp(accent, 'g');\n});\n\n/**\n * Replaces accented characters to its equivalent with no accent.\n *\n * @param {String} text: the text to transform\n * @return {String}\n */\nexport default function ignoreAccent(text) {\n CHARS.accents.forEach((charCode, i) => {\n text = text.replace(getPattern(charCode), CHARS.replacements[i]);\n });\n // ignores case sensitive\n return text.toUpperCase();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/ignore-accent.js","import generateCharCodes from './generate-char-codes';\n\nconst unshift = Array.prototype.unshift;\n\nexport const CHARS = {\n accents: [\n 194, 226, 192, 224, 193, 225, 196, 228, 195, 227, 197, 229, // ÂâÀàÁáÄäÃãÅå\n 202, 234, 200, 232, 201, 233, 203, 235, // ÊêÈèÉéËë\n 206, 238, 204, 236, 205, 237, 207, 239, // ÎîÌìÍíÏï\n 212, 244, 210, 242, 211, 243, 214, 246, 213, 245, // ÔôÒòÓóÖöÕõ\n 219, 251, 217, 249, 218, 250, 220, 252, // ÛûÙùÚúÜü\n 209, 241, 221, 253, 255, // ÑñÝýÿ\n ],\n replacements: 'AaAaAaAaAaAaEeEeEeEeIiIiIiIiOoOoOoOoOoUuUuUuUuNnYyy'.split(''),\n};\n\n/**\n * Registers a map of accents in order to sort strings correctly.\n *\n * @param {String} accents: the string with the accents\n * @param {String} replacements: the replacement for each accent\n */\nexport default function mapAccents(accents, replacements) {\n unshift.apply(CHARS.accents, generateCharCodes(accents));\n unshift.apply(CHARS.replacements, replacements.split(''));\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/map-accents.js","/**\n * Sorts an array by allowing multiple sorting criteria.\n *\n * It applies the Schwartzian transform:\n * https://en.wikipedia.org/wiki/Schwartzian_transform\n *\n * Author: David Rivera\n * Github: https://github.com/jherax\n * License: \"MIT\"\n *\n * You can fork this project on github:\n * https://github.com/jherax/array-sort-by.git\n */\nimport ignoreAccent from './ignore-accent';\nimport defaultSort from './default-sort';\nimport sortItems from './sort-items';\nimport mapAccents from './map-accents';\n\nconst normalizeString = (items) => {\n items = [].concat(items);\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (typeof items[i] === 'string') {\n items[i] = ignoreAccent(items[i]);\n }\n }\n return items;\n};\n\n/**\n * @public\n *\n * Sorts an array by allowing multiple sorting criteria.\n *\n * @param {Array} array: the list of elements to sort\n * @param {Function} parser: transforms each item and specifies the sorting mode\n * @return {Array}\n */\nexport default function sortBy(array, parser) {\n let i, item;\n const arrLength = array.length;\n if (typeof parser !== 'function') {\n return array.sort(defaultSort());\n }\n // Schwartzian transform (decorate-sort-undecorate)\n for (i = arrLength; i;) {\n item = array[i -= 1];\n // decorate the array\n array[i] = [].concat(\n normalizeString(parser.call(null, item, i)),\n item,\n );\n }\n // console.log('decorated:', JSON.stringify(array));\n array.sort(sortItems);\n // undecorate the array\n for (i = arrLength; i;) {\n item = array[i -= 1];\n array[i] = item[item.length - 1];\n }\n return array;\n}\n\nsortBy.mapAccents = mapAccents;\n\n\n\n// WEBPACK FOOTER //\n// ./src/sort-by.js","/**\n * Gets the char-code value for every character in a text.\n *\n * @param {String} text: the values to be translated to the unicode char-code\n * @return {Array<Number>}\n */\nexport default function generateCharCodes(text) {\n const charcodes = [];\n for (let i = 0; i < text.length; i += 1) {\n charcodes.push(text.charCodeAt(i));\n }\n return charcodes;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/generate-char-codes.js","/**\n * @private\n */\nconst ESCAPE_CHARS = /[.*+?^=!:${}()|\\-[\\]/\\\\]/g;\n\n/**\n * Escapes the special characters in the entry parameter, so that\n * it can be used as a pattern in a regular expression constructor.\n *\n * @param {String} text: special characters to escape\n * @return {String}\n */\nexport default function escapeRegExp(text) {\n return text.replace(ESCAPE_CHARS, '\\\\$&');\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/escapeRegExp.js","/**\n * High-order function that memoizes a function, by creating a scope\n * to store the result of each function call, returning the cached\n * result when the same inputs is given.\n *\n * @description\n * Memoization is an optimization technique used primarily to speed up\n * functions by storing the results of expensive function calls, and returning\n * the cached result when the same inputs occur again.\n *\n * Each time a memoized function is called, its parameters are used as keys to index the cache.\n * If the index (key) is present, then it can be returned, without executing the entire function.\n * If the index is not cached, then all the body of the function is executed, and the result is\n * added to the cache.\n *\n * @see https://www.sitepoint.com/implementing-memoization-in-javascript/\n * @see https://gist.github.com/jherax/a3208b5c3d342a756008444ad81d8045\n *\n * @param {Function} func: function to memoize\n * @return {Function}\n */\nexport default function memoize(func) {\n const cache = {};\n return function memoized(...args) {\n const key = JSON.stringify(args);\n if (key in cache) return cache[key];\n cache[key] = func(...args);\n return cache[key];\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/memoize.js","import ignoreAccent from './ignore-accent';\n\n/**\n * Creates a closure that encapsulates the default sorting function.\n *\n * @return {Function}\n */\nexport default function defaultSort() {\n const cache = {};\n\n /**\n * Defines the default sorting mode (ASC)\n *\n * @param {Any} prev: element at n index to compare\n * @param {Any} next: element at n+1 index to compare\n * @return {Number}\n */\n return function sort(prev, next) {\n if (typeof prev === 'string') {\n if (!(prev in cache)) cache[prev] = ignoreAccent(prev);\n if (!(next in cache)) cache[next] = ignoreAccent(next);\n prev = cache[prev];\n next = cache[next];\n }\n if (prev === next) return 0;\n return (prev > next ? 1 : -1);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/default-sort.js","const DESC = /^desc:\\s*/i;\n\n/**\n * @private\n *\n * Compares each element and defines the sorting mode.\n * @see http://ow.ly/UvDD309zozK\n *\n * @param {Any} prev: n element to compare\n * @param {Any} next: n+1 element to compare\n * @return {Number}\n */\nfunction comparer(prev, next) {\n let asc = 1;\n if (typeof prev === 'string') {\n if (DESC.test(prev)) asc = -1;\n }\n if (prev === next) return 0;\n return (prev > next ? 1 : -1) * asc;\n}\n\n/**\n * Compares each decorated element.\n *\n * @param {Array} prevItems: decorated element at n index to compare\n * @param {Array} nextItems: decorated element at n+1 index to compare\n * @return {Number}\n */\nexport default function sortItems(prevItems, nextItems) {\n let i, ordered;\n for (i in prevItems) { // eslint-disable-line\n ordered = comparer(prevItems[i], nextItems[i]);\n if (ordered) return ordered;\n }\n return 0;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/sort-items.js"],"sourceRoot":""}