Source: match_data.js

/**
 * Contains and collects metadata about a matching document.
 * A single instance of lunr.MatchData is returned as part of every
 * lunr.Index~Result.
 *
 * @constructor
 * @property {string[]} terms - All the query terms that the document matched.
 * @property {object} metadata - A collection of metadata associated with this document.
 * @see {@link lunr.Index~Result}
 */
lunr.MatchData = function (term, field, metadata) {
  this.terms = [term]

  this.metadata = {}
  this.metadata[field] = metadata
}

/**
 * An instance of lunr.MatchData will be created for every term that matches a
 * document. However only one instance is required in a lunr.Index~Result. This
 * method combines metadata from another instance of lunr.MatchData with this
 * objects metadata.
 *
 * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.
 * @see {@link lunr.Index~Result}
 */
lunr.MatchData.prototype.combine = function (otherMatchData) {
  this.terms = this.terms.concat(otherMatchData.terms)

  var otherMatchDataFields = Object.keys(otherMatchData.metadata)

  for (var i = 0; i < otherMatchDataFields.length; i++) {
    var field = otherMatchDataFields[i],
        fieldMetadata = otherMatchData.metadata[field],
        fieldMetadataKeys = Object.keys(fieldMetadata)

    for (var j = 0; j < fieldMetadataKeys.length; j++) {
      var metadataKey = fieldMetadataKeys[j]
      this.metadata[field][metadataKey] = this.metadata[field][metadataKey].concat(fieldMetadata[metadataKey])
    }
  }
}