function reduceRight(collection, callback, accumulator, thisArg) {
    if (!collection) {
      return accumulator;
    }

    var length = collection.length,
        noaccum = arguments.length < 3;

    if(thisArg) {
      callback = iteratorBind(callback, thisArg);
    }
    // Opera 10.53-10.60 JITted `length >>> 0` returns the wrong value for negative numbers
    if (length > -1 && length === length >>> 0) {
      var iteratee = noCharByIndex && toString.call(collection) == stringClass
        ? collection.split('')
        : collection;

      if (length && noaccum) {
        accumulator = iteratee[--length];
      }
      while (length--) {
        accumulator = callback(accumulator, iteratee[length], length, collection);
      }
      return accumulator;
    }

    var prop,
        props = keys(collection);

    length = props.length;
    if (length && noaccum) {
      accumulator = collection[props[--length]];
    }
    while (length--) {
      prop = props[length];
      accumulator = callback(accumulator, collection[prop], prop, collection);
    }
    return accumulator;
  }
The right-associative version of `_.reduce`.

@static
@memberOf _
@alias foldr
@category Collections
@param {Array|Object|String} collection The collection to iterate over.
@param {Function} callback The function called per iteration.
@param {Mixed} [accumulator] Initial value of the accumulator.
@param {Mixed} [thisArg] The `this` binding for the callback.
@returns {Mixed} Returns the accumulated value.
@example

var list = [[0, 1], [2, 3], [4, 5]];
var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
// => [4, 5, 2, 3, 0, 1]