Skip to content

Instantly share code, notes, and snippets.

@jhihn
Created November 30, 2015 17:00
Show Gist options
  • Save jhihn/dbcf0a1f83908c4ea638 to your computer and use it in GitHub Desktop.
Save jhihn/dbcf0a1f83908c4ea638 to your computer and use it in GitHub Desktop.
validate an object by the presence of it's properties
function validateObjStructure(obj, structure) {
if (structure.length > 0)
while (structure[0] == '.')
structure = structure.substr(1)
console.log('Call:', JSON.stringify(obj), structure)
var dot = structure.indexOf('.')
var bracket = structure.indexOf('[')
var prop;
if (dot === -1 && bracket === -1) { // a
console.log('A-')
return obj.hasOwnProperty(structure);
} else { // a.b[ or a[].b
console.log('B-')
if (dot === -1) dot = structure.length + 1
if (bracket === -1) bracket = structure.length + 1
var smallest = dot < bracket ? dot : bracket;
if (smallest == dot) { // a.
prop = structure.substr(0, dot);
console.log('B-A prop:', prop)
return validateObjStructure(obj[prop], structure.substr(dot+1));
} else {
var endBracket = structure.indexOf(']')
if (bracket === 0) { // [
prop = structure.substr(bracket+1, endBracket-bracket-1)
console.log('p1', prop, prop.length)
if (prop.length === 0)
prop = 0;
console.log('B-B prop:', prop, obj) // [
return validateObjStructure(obj[prop], structure.substr(endBracket+2));
} else { // a[
prop = structure.substr(0, bracket)
console.log('B-C prop:', prop, obj) // a[
return validateObjStructure(obj[prop], structure.substr(bracket));
}
}
}
}
//var positiveTestCases = {
// 'a': {a:1},
// 'a.b': {a: {b:1} },
// 'b[].c': {a:1, b:[{c:1}]},
// 'b[1].c': {a:1, b:[{d:1},{c:1}]}
//};
//for (var testCase in positiveTestCases) {
// console.log(testCase, validateObjStructure(positiveTestCases[testCase], testCase) === true);
//}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment