function evaluateKeyPathOnValue(value, keyPath, multiEntry) {
    if (Array.isArray(keyPath)) {
        const arrayValue = [];
        return keyPath.some(kpPart => {
            // If W3C tests are accurate, it appears sequence<DOMString> implies `toString()`
            // See also https://heycam.github.io/webidl/#idl-DOMString
            // and http://stackoverflow.com/questions/38164752/should-a-call-to-db-close-within-upgradeneeded-inevitably-prevent-onsuccess
            kpPart = util.isObj(kpPart) ? kpPart.toString() : kpPart;
            let key = extractKeyFromValueUsingKeyPath(value, kpPart, multiEntry);
            try {
                key = convertValueToKey(key);
            } catch (err) {
                return true;
            }
            arrayValue.push(key);
        }, []) ? undefined : arrayValue;
    }
    if (keyPath === '') {
        return value;
    }
    const identifiers = keyPath.split('.');
    identifiers.some((idntfr, i) => {
        if (idntfr === 'length' && typeof value === 'string' && i === identifiers.length - 1) {
            value = value.length;
            return true;
        }
        if (!util.isObj(value)) {
            value = undefined;
            return true;
        }
        value = value[idntfr];
        return value === undefined;
    });
    return value;
}
/**
 * Returns the value of an inline key based on a key path
 * @param {object} source
 * @param {string|array} keyPath
 */
Returns the value of an inline key based on a key path
@param {object} source
@param {string|array} keyPath
Returns the value of an inline key based on a key path @param { object } source @param { string|array } keyPath
function evaluateKeyPathOnValue(value, keyPath, multiEntry) {
    if (Array.isArray(keyPath)) {
        const arrayValue = [];
        return keyPath.some(kpPart => {
            kpPart = util.isObj(kpPart) ? kpPart.toString() : kpPart;
            let key = extractKeyFromValueUsingKeyPath(value, kpPart, multiEntry);
            try {
                key = convertValueToKey(key);
            } catch (err) {
                return true;
            }
            arrayValue.push(key);
        }, []) ? undefined : arrayValue;
    }
    if (keyPath === '') {
        return value;
    }
    const identifiers = keyPath.split('.');
    identifiers.some((idntfr, i) => {
        if (idntfr === 'length' && typeof value === 'string' && i === identifiers.length - 1) {
            value = value.length;
            return true;
        }
        if (!util.isObj(value)) {
            value = undefined;
            return true;
        }
        value = value[idntfr];
        return value === undefined;
    });
    return value;
}
function evaluateKeyPathOnValue ( value , keyPath , multiEntry ) { if ( Array . isArray ( keyPath ) ) { const arrayValue = [ ] ; return keyPath . some ( kpPart => { kpPart = util . isObj ( kpPart ) ? kpPart . toString ( ) : kpPart ; let key = extractKeyFromValueUsingKeyPath ( value , kpPart , multiEntry ) ; try { key = convertValueToKey ( key ) ; } catch ( err ) { return true ; } arrayValue . push ( key ) ; } , [ ] ) ? undefined : arrayValue ; } if ( keyPath === '' ) { return value ; } const identifiers = keyPath . split ( '.' ) ; identifiers . some ( ( idntfr , i ) => { if ( idntfr === 'length' && typeof value === 'string' && i === identifiers . length - 1 ) { value = value . length ; return true ; } if ( ! util . isObj ( value ) ) { value = undefined ; return true ; } value = value [ idntfr ] ; return value === undefined ; } ) ; return value ; }
Returns the value of an inline key based on a key path
 @param {object} source
 @param {string|array} keyPath
Returns the value of an inline key based on a key path @param { object } source @param { string|array } keyPath
// If W3C tests are accurate, it appears sequence<DOMString> implies `toString()` // See also https://heycam.github.io/webidl/#idl-DOMString // and http://stackoverflow.com/questions/38164752/should-a-call-to-db-close-within-upgradeneeded-inevitably-prevent-onsuccess