var JSONPathParser = function () { /** * Access a simple json path expression of an object. * Returns the accessed value or null if the access was not possible. * * @param inputObject the object to access * @param inputString the json path expression * @returns {*} */ this.access = function (inputObject, inputString) { if (inputObject === null || inputObject === undefined) { return null; } if (inputString.length === 0) { return inputObject; } let startDot = inputString.indexOf('.'); if (startDot === -1) { startDot = inputString.length; } let keyString = inputString.slice(0, startDot); let inputStringTail = inputString.slice(startDot + 1); let startParentheses = keyString.indexOf('['); if (startParentheses === -1) { let targetObject = this._getTargetObject(inputObject, keyString); if (targetObject == null) { return null; } return this.access(targetObject, inputStringTail) } else { let indexString = keyString.slice(startParentheses + 1, keyString.length - 1); keyString = keyString.slice(0, startParentheses); let targetObject = this._getTargetObject(inputObject, keyString); if (targetObject == null) { return null; } switch (indexString) { case "@random": return this.access(this.randomElement(targetObject), inputStringTail); // add special keywords here default: // expecting integer return this.access(targetObject[parseInt(indexString)], inputStringTail); } } }; /** * Check validity of the key string and return the target object or null. * @param inputObject * @param keyString * @returns {*} * @private */ this._getTargetObject = function (inputObject, keyString) { if (!keyString.empty && keyString !== "$" && !inputObject.hasOwnProperty(keyString)) { return null; } return (keyString === "$") ? inputObject : inputObject[keyString]; }; /** * Returns the value of a random key of a given object. * * @param inputObject * @returns {*} */ this.randomElement = function (inputObject) { let keys = Object.keys(inputObject); let randomIndex = Math.floor(Math.random() * keys.length); return inputObject[keys[randomIndex]]; } };