function formatStringEx(format, data) {
  if(arguments.length > 2) {
    data = _.takeRight(arguments, arguments.length - 1);
  } else if (!(_.isArray(data) || _.isObject(data))) {
    data = [data];
  }

  return _.replace(format, /{(.+?)}/g, function(match, token) {
    return _.get(data, token);
  });
}
Replaces matches for path tokens surrounded by single curly brackets in string with value from object. See _.get for path usage.

@static
@memberOf _
@param {string} format - The string with replacement tokens.
@param {...*} data - The data used for the tokens to populate the format string.
@returns {string} The string with replaced tokens.
@example
_.formatStringEx('Hallo {[0]}!', 'Welt') => 'Hallo Welt!'