From f729769d85390217c2be02697c195b2bb71e6967 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Sun, 31 Oct 2010 19:00:21 -0600 Subject: [PATCH] Fix reduceRight() so that if you don't pass in an initial value, the last item in the collection is used --- test/collections.js | 10 ++++++++-- underscore.js | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/test/collections.js b/test/collections.js index 4e7c7ab6b..7896ef3ff 100644 --- a/test/collections.js +++ b/test/collections.js @@ -68,8 +68,14 @@ $(document).ready(function() { }); test('collections: reduceRight', function() { - var list = _.foldr([1, 2, 3], function(memo, num){ return memo + num; }, ''); - equals(list, '321', 'can perform right folds'); + var list = _.reduceRight(["foo", "bar", "baz"], function(memo, str){ return memo + str; }, ''); + equals(list, 'bazbarfoo', 'can perform right folds'); + + var list = _.foldr(["foo", "bar", "baz"], function(memo, str){ return memo + str; }, ''); + equals(list, 'bazbarfoo', 'aliased as "foldr"'); + + var list = _.foldr(["foo", "bar", "baz"], function(memo, str){ return memo + str; }); + equals(list, 'bazbarfoo', 'default initial value'); }); test('collections: detect', function() { diff --git a/underscore.js b/underscore.js index 6bd1ee3ca..476b85e2a 100644 --- a/underscore.js +++ b/underscore.js @@ -107,7 +107,9 @@ _.reduceRight = _.foldr = function(obj, iterator, memo, context) { if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { if (context) iterator = _.bind(iterator, context); - return obj.reduceRight(iterator, memo); + var args = [iterator]; + if (memo !== undefined) args.push(memo); + return obj.reduceRight.apply(obj, args); } var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse(); return _.reduce(reversed, iterator, memo, context);