pick (value) {
    if (value === undefined) {
      return
    }
    if (this.type === 'object') {
      const copy = {}
      const properties = this.properties
      if (properties) {
        utils.forOwn(properties, (_definition, prop) => {
          copy[prop] = _definition.pick(value[prop])
        })
      }
      if (this.extends) {
        utils.fillIn(copy, this.extends.pick(value))
      }
      // Conditionally copy properties not defined in "properties"
      if (this.additionalProperties) {
        for (var key in value) {
          if (!properties[key]) {
            copy[key] = utils.plainCopy(value[key])
          }
        }
      }
      return copy
    } else if (this.type === 'array') {
      return value.map((item) => {
        const _copy = this.items ? this.items.pick(item) : {}
        if (this.extends) {
          utils.fillIn(_copy, this.extends.pick(item))
        }
        return _copy
      })
    }
    return utils.plainCopy(value)
  }
Create a copy of the given value that contains only the properties defined
in this schema.

@name Schema#pick
@method
@param {*} value The value to copy.
@returns {*} The copy.