diff --git a/src/lru.js b/src/lru.js index 8ed976d..dc21f0f 100644 --- a/src/lru.js +++ b/src/lru.js @@ -108,7 +108,7 @@ export class LRU { * * @method entries * @memberof LRU - * @param {string[]} [keys=this.keys()] - Array of keys to get entries for. Defaults to all keys. + * @param {string[]} [keys] - Array of keys to get entries for. If omitted, returns all keys. * @returns {Array>} Array of [key, value] pairs in LRU order. * @example * cache.set('a', 1).set('b', 2); @@ -118,11 +118,22 @@ export class LRU { * @see {@link LRU#values} * @since 11.1.0 */ - entries (keys = this.keys()) { + entries (keys) { + if (keys === undefined) { + keys = this.keys(); + } + + const entryMap = Object.create(null); + let x = this.first; + + while (x !== null) { + entryMap[x.key] = x.value; + x = x.next; + } + const result = new Array(keys.length); for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - result[i] = [key, this.get(key)]; + result[i] = [keys[i], entryMap[keys[i]]]; } return result; @@ -425,7 +436,7 @@ export class LRU { * * @method values * @memberof LRU - * @param {string[]} [keys=this.keys()] - Array of keys to get values for. Defaults to all keys. + * @param {string[]} [keys] - Array of keys to get values for. If omitted, returns all values. * @returns {Array<*>} Array of values corresponding to the keys in LRU order. * @example * cache.set('a', 1).set('b', 2); @@ -435,10 +446,22 @@ export class LRU { * @see {@link LRU#entries} * @since 11.1.0 */ - values (keys = this.keys()) { + values (keys) { + if (keys === undefined) { + keys = this.keys(); + } + + const entryMap = Object.create(null); + let x = this.first; + + while (x !== null) { + entryMap[x.key] = x.value; + x = x.next; + } + const result = new Array(keys.length); for (let i = 0; i < keys.length; i++) { - result[i] = this.get(keys[i]); + result[i] = entryMap[keys[i]]; } return result;