From 56c1bf01a476956b00bd5e0efea623486b60d3bd Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Wed, 17 Dec 2014 19:54:26 -0800 Subject: [PATCH] Ensure trim methods and `_.words` work as an iteratee for `_.map` with string objects. --- lodash.js | 20 ++++++++++++-------- test/test.js | 12 ++++++++---- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lodash.js b/lodash.js index 50af7b996..cf4ca967e 100644 --- a/lodash.js +++ b/lodash.js @@ -4926,9 +4926,10 @@ iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted; isSorted = false; } - if (iteratee != null) { - iteratee = getCallback(iteratee, thisArg, 3); - } + iteratee = iteratee == null + ? iteratee + : getCallback(iteratee, thisArg, 3); + return (isSorted && getIndexOf() == baseIndexOf) ? sortedUniq(array, iteratee) : baseUniq(array, iteratee); @@ -9196,8 +9197,8 @@ // Firefox < 21 and Opera < 15 follow ES3 for `parseInt` and // Chrome fails to trim leading whitespace characters. // See https://code.google.com/p/v8/issues/detail?id=3109. - string = trim(string); radix = (guard && isIterateeCall(string, radix, guard)) ? 0 : +radix; + string = trim(string); return nativeParseInt(string, radix || (reHexPrefix.test(string) ? 16 : 10)); }; } @@ -9517,11 +9518,12 @@ * // => 'fred' */ function trim(string, chars, guard) { + var value = string; string = string == null ? '' : String(string); if (!string) { return string; } - if (guard ? isIterateeCall(string, chars, guard) : chars == null) { + if (guard ? isIterateeCall(value, chars, guard) : chars == null) { return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1); } chars = String(chars); @@ -9547,11 +9549,12 @@ * // => 'fred-_-' */ function trimLeft(string, chars, guard) { + var value = string; string = string == null ? '' : String(string); if (!string) { return string; } - if (guard ? isIterateeCall(string, chars, guard) : chars == null) { + if (guard ? isIterateeCall(value, chars, guard) : chars == null) { return string.slice(trimmedLeftIndex(string)) } chars = String(chars); @@ -9577,11 +9580,12 @@ * // => '-_-fred' */ function trimRight(string, chars, guard) { + var value = string; string = string == null ? '' : String(string); if (!string) { return string; } - if (guard ? isIterateeCall(string, chars, guard) : chars == null) { + if (guard ? isIterateeCall(value, chars, guard) : chars == null) { return string.slice(0, trimmedRightIndex(string) + 1) } chars = String(chars); @@ -9715,10 +9719,10 @@ * // => ['fred', 'barney', '&', 'pebbles'] */ function words(string, pattern, guard) { - string = string != null && String(string); if (guard && isIterateeCall(string, pattern, guard)) { pattern = null; } + string = string != null && String(string); return (string && string.match(pattern || reWords)) || []; } diff --git a/test/test.js b/test/test.js index 849593c60..ee91c08fc 100644 --- a/test/test.js +++ b/test/test.js @@ -8998,7 +8998,9 @@ }); test('should work as an iteratee for `_.map`', 2, function() { - var actual = _.map(['6', '08', '10'], _.parseInt); + var strings = _.map(['6', '08', '10'], Object), + actual = _.map(strings, _.parseInt); + deepEqual(actual, [6, 8, 10]); actual = _.map('123', _.parseInt); @@ -12540,8 +12542,8 @@ strictEqual(func(string, ''), string); }); - test('should work as an iteratee for `_.map`', 1, function() { - var string = whitespace + 'a b c' + whitespace, + test('`_.' + methodName + '` should work as an iteratee for `_.map`', 1, function() { + var string = Object(whitespace + 'a b c' + whitespace), trimmed = (index == 2 ? whitespace : '') + 'a b c' + (index == 1 ? whitespace : ''), actual = _.map([string, string, string], func); @@ -12898,7 +12900,9 @@ }); test('should work as an iteratee for `_.map`', 1, function() { - var actual = _.map(['a', 'b', 'c'], _.words); + var strings = _.map(['a', 'b', 'c'], Object), + actual = _.map(strings, _.words); + deepEqual(actual, [['a'], ['b'], ['c']]); });