RandomWallpaperGnome3/randomwallpaper@iflow.space/jsonpath/jsonpath.js
2017-08-23 20:24:15 +02:00

136 lines
No EOL
3 KiB
JavaScript

let 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) {
if (!keyString.empty && !inputObject.hasOwnProperty(keyString)) {
return null;
}
return this.access(inputObject[keyString], inputStringTail)
} else {
let indexString = keyString.slice(startParentheses+1, keyString.length-1);
keyString = keyString.slice(0, startParentheses);
if (!keyString.empty && !inputObject.hasOwnProperty(keyString)) {
return null;
}
switch (indexString) {
case "@random":
return this.access(this.randomElement(inputObject[keyString]), inputStringTail);
// add special keywords here
default:
// expecting integer
return this.access(inputObject[keyString][parseInt(indexString)], inputStringTail);
}
}
};
/**
* 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]];
}
};
/*
Tests
*/
let parser = new JSONPathParser();
let accessString = "naise";
let object = {naise: "one"};
let val;
console.log(`Accessing "${accessString}"`);
val = parser.access(object, accessString);
console.log(`Value: ${val}`);
console.log(`=================`);
accessString = "going.deep.anyArrayOrObject[1].someKey";
object = {
naise: "one",
going: {
deep: {
anyArrayOrObject: [
{someKey: "I am 1!"},
{someKey: "I am 2!"},
{someKey: "I am 3!"},
{someKey: "I am 4!"},
{someKey: "I am 5!"},
{someKey: "I am 6!"},
{someKey: "I am 7!"},
{someKey: "I am 8!"},
]
}
}
};
console.log(`Accessing "${accessString}"`);
val = parser.access(object, accessString);
console.log(`Value: ${val}`);
console.log(`=================`);
accessString = "going.deep.anyArrayOrObject[@random].someKey";
object = {
naise: "one",
going: {
deep: {
anyArrayOrObject: [
{someKey: "I am 1!"},
{someKey: "I am 2!"},
{someKey: "I am 3!"},
{someKey: "I am 4!"},
{someKey: "I am 5!"},
{someKey: "I am 6!"},
{someKey: "I am 7!"},
{someKey: "I am 8!"},
]
}
}
};
console.log(`Accessing "${accessString}"`);
val = parser.access(object, accessString);
console.log(`Value: ${val}`);
console.log(`=================`);