From 21e061a6c87844047b95b801e2f9c425244f37c2 Mon Sep 17 00:00:00 2001 From: Nathan Woltman Date: Mon, 28 Oct 2019 22:00:08 -0400 Subject: [PATCH] improvement: Perf boost with custom alphabet Improve perf by ensuring that the `alphabetIndexMap` array is not marked as "holey". --- natural-compare.js | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/natural-compare.js b/natural-compare.js index 20cc692..860b191 100644 --- a/natural-compare.js +++ b/natural-compare.js @@ -1,8 +1,7 @@ 'use strict'; var alphabet; -var alphabetIndexMap; -var alphabetIndexMapLength = 0; +var alphabetIndexMap = []; function isNumberCode(code) { return code >= 48 && code <= 57; @@ -74,8 +73,8 @@ function naturalCompare(a, b, opts) { if (charCodeA !== charCodeB) { if ( - charCodeA < alphabetIndexMapLength && - charCodeB < alphabetIndexMapLength && + charCodeA < alphabetIndexMap.length && + charCodeB < alphabetIndexMap.length && alphabetIndexMap[charCodeA] !== -1 && alphabetIndexMap[charCodeB] !== -1 ) { @@ -110,20 +109,20 @@ Object.defineProperties(naturalCompare, { alphabet = value; alphabetIndexMap = []; - var i = 0; - - if (alphabet) { - for (; i < alphabet.length; i++) { - alphabetIndexMap[alphabet.charCodeAt(i)] = i; - } + if (!alphabet) { + return; } - alphabetIndexMapLength = alphabetIndexMap.length; + const maxCharCode = alphabet.split('').reduce((maxCode, char) => { + return Math.max(maxCode, char.charCodeAt(0)); + }, 0); - for (i = 0; i < alphabetIndexMapLength; i++) { - if (alphabetIndexMap[i] === undefined) { - alphabetIndexMap[i] = -1; - } + for (let i = 0; i <= maxCharCode; i++) { + alphabetIndexMap.push(-1); + } + + for (let i = 0; i < alphabet.length; i++) { + alphabetIndexMap[alphabet.charCodeAt(i)] = i; } }, },