From 3de0a16a9dd981145139a44873866626e452b55c Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Thu, 18 Jul 2013 08:30:05 -0700 Subject: [PATCH] Add `_.where` fast path for the common use case or passing an object with one property. Former-commit-id: dfb78f59ae22f3ccdd88d58cefdb8abcde58eda6 --- build.js | 17 ++++++++++------- lodash.js | 12 +++++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/build.js b/build.js index 56b0f633d..84357014b 100644 --- a/build.js +++ b/build.js @@ -102,7 +102,7 @@ 'compose': [], 'contains': ['basicEach', 'getIndexOf', 'isString'], 'countBy': ['createCallback', 'forEach'], - 'createCallback': ['identity', 'isEqual', 'keys'], + 'createCallback': ['identity', 'isEqual', 'isObject', 'keys'], 'debounce': ['isObject'], 'defaults': ['createCallback', 'createIterator'], 'defer': ['bind'], @@ -3657,6 +3657,15 @@ ' : (first ? find : filter)(collection, properties);', '}' ].join('\n')); + + // simplify `_.createCallback` + source = source.replace(matchFunction(source, 'createCallback'), function(match) { + return match + // remove unnecessary fast path + .replace(/^(( *)var props *=.+?),[\s\S]+?\n\2}/m, '$1;') + // remove `_.isEqual` use + .replace(/=.+?\bisEqual\((.+?), *(.+?),.+?\)/, '= $1 === $2'); + }); } // replace `_.zip` if(!isLodash('zip')) { @@ -3703,12 +3712,6 @@ } }); - // remove `_.isEqual` use from `createCallback` - if (!isLodash('where')) { - source = source.replace(matchFunction(source, 'createCallback'), function(match) { - return match.replace(/=.+?\bisEqual\((.+?), *(.+?),.+?\)/, '= $1 === $2'); - }); - } // remove unused features from `createBound` if (_.every(['bindKey', 'partial', 'partialRight'], function(funcName) { return !_.contains(buildFuncs, funcName); diff --git a/lodash.js b/lodash.js index aa34d0ab1..08056ca63 100644 --- a/lodash.js +++ b/lodash.js @@ -4762,10 +4762,20 @@ return object[func]; }; } - var props = keys(func); + var props = keys(func), + key = props[0], + a = func[key]; + + if (props.length == 1 && a === a && !isObject(a)) { + return function(object) { + var b = object[key]; + return a === b && (a !== 0 || (1 / a == 1 / b)); + }; + } return function(object) { var length = props.length, result = false; + while (length--) { if (!(result = isEqual(object[props[length]], func[props[length]], indicatorObject))) { break;