code: function parents(tree, query, options) {
      var compiledQuery = _.isFunction(query) ? _.noop : _.matches(query);
      var seekStack = [];
  
      var settings = _.defaults(options, {
        childNode: ['children']
      });
  
      settings.childNode = _.castArray(settings.childNode);
  
      var seekDown = function seekDown(tree) {
        var foundChild = _.find(tree, _.isFunction(query) ? query : compiledQuery);
  
        if (foundChild) {
          seekStack.unshift(foundChild);
          return true;
        } else {
          return tree.some(function (branch) {
            var walkedStack = false;
            settings.childNode.some(function (key) {
              // Walk down first found childNode entry
              if (branch[key] && _.isArray(branch[key]) && seekDown(branch[key])) {
                // Found a valid key - stop iterating over possible key names
                seekStack.unshift(branch);
                walkedStack = true;
                return true;
              }
            });
            return walkedStack;
          });
        }
      };
  
      seekDown(_.castArray(tree));
      return seekStack;
    }
docs: Utility function to deep search a tree structure for a matching query and find parents up to the given query
  If found this function will return an array of all generations with the found branch as the last element of the array (i.e. root -> grandchildren order)
  @param {Object|array} tree The tree structure to search
  @param {Object|function} query A valid lodash query to run (anything valid via _.find()) or a matching function to be run on each node
  @param {Object} [options] Optional options object
  @param {array|string} [options.childNode="children"] Node or nodes to examine to discover the child elements
  @return {array} A generation list of all parents decending to the found item