From 4b95f079234589b872990bdf164fc5f222a1d705 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Sat, 13 Oct 2012 23:32:17 -0700 Subject: [PATCH] Simplify `_.omit` and `_.pick` for the `lodash underscore` build. Former-commit-id: 9a42c964ce4003bde1b4ce55f0f851141dbc9bb6 --- build.js | 39 ++++++++++++++++++++++++++++++++++++++- test/test-build.js | 7 +++++++ test/test.js | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/build.js b/build.js index 4bb8eeac9..aacd7eded 100755 --- a/build.js +++ b/build.js @@ -70,7 +70,7 @@ 'clone': ['extend', 'forEach', 'forOwn', 'isArguments', 'isPlainObject'], 'compact': [], 'compose': [], - 'contains': ['some'], + 'contains': ['indexOf', 'some'], 'countBy': ['forEach'], 'debounce': [], 'defaults': ['isArguments'], @@ -975,6 +975,7 @@ if (isUnderscore) { dependencyMap.isEqual = ['isArray', 'isFunction']; dependencyMap.isEmpty = ['isArray', 'isString']; + dependencyMap.pick = []; if (useUnderscoreClone) { dependencyMap.clone = ['extend', 'isArray']; @@ -1132,6 +1133,39 @@ ' }' ].join('\n')); + // replace `_.omit` + source = source.replace(/^( +)function omit[\s\S]+?\n\1}/m, [ + ' function omit(object) {', + ' var props = concat.apply(ArrayProto, arguments),', + ' result = {};', + '', + ' forIn(object, function(value, key) {', + ' if (indexOf(props, key, 1) < 0) {', + ' result[key] = value;', + ' }', + ' });', + ' return result;', + ' }' + ].join('\n')); + + // replace `_.pick` + source = source.replace(/^( +)function pick[\s\S]+?\n\1}/m, [ + ' function pick(object) {', + ' var index = 0,', + ' props = concat.apply(ArrayProto, arguments),', + ' length = props.length,', + ' result = {};', + '', + ' while (++index < length) {', + ' var prop = props[index];', + ' if (prop in object) {', + ' result[prop] = object[prop];', + ' }', + ' }', + ' return result;', + ' }' + ].join('\n')); + // replace `_.without` source = source.replace(/^( +)function without[\s\S]+?\n\1}/m, [ ' function without(array) {', @@ -1149,6 +1183,9 @@ ' }' ].join('\n')); + // remove string support from `_.contains` + source = source.replace(/return *\(toString\.call.+?stringClass[\s\S]+?;/, 'return indexOf(collection, target) > -1;'); + // replace `arrayLikeClasses` in `_.isEqual` source = source.replace(/(?: *\/\/.*\n)*( +)var isArr *= *arrayLikeClasses[^}]+}/, '$1var isArr = isArray(a);'); diff --git a/test/test-build.js b/test/test-build.js index 5a649c25e..c113f6831 100644 --- a/test/test-build.js +++ b/test/test-build.js @@ -639,6 +639,13 @@ object = { 'fn': lodash.bind(function(x) { return this.x + x; }, { 'x': 1 }, 1) }; equal(object.fn(), 2, '_.bind: ' + basename); + object = { 'a': 1, 'b': 2, 'c': 3 }; + var actual = lodash.omit(object, function(value) { return value == 3; }); + deepEqual(_.keys(actual).sort(), ['a', 'b', 'c'], '_.omit: ' + basename); + + actual = lodash.pick(object, function(value) { return value != 3; }); + deepEqual(_.keys(actual), [], '_.pick: ' + basename); + ok(lodash.clone(array, true)[0] === array[0], '_.clone: ' + basename); start(); }); diff --git a/test/test.js b/test/test.js index ec392f583..f7a08e3b3 100644 --- a/test/test.js +++ b/test/test.js @@ -1499,7 +1499,7 @@ equal(compiled(data), '1'); }); - + test('should work when passing `options.variable`', function() { var compiled = _.template( '<% _.forEach( data.a, function( value ) { %>' +