An improved solution with filtering possibilities. This result is more convenient as you can refer any object property directly with array paths like:
["aProperty.aSetting1", "aProperty.aSetting2", "aProperty.aSetting3", "aProperty.aSetting4", "aProperty.aSetting5", "bProperty.bSetting1.bPropertySubSetting", "bProperty.bSetting2", "cProperty.cSetting"]
/**
* Recursively searches for properties in a given object.
* Ignores possible prototype endless enclosures.
* Can list either all properties or filtered by key name.
*
* @param {Object} object Object with properties.
* @param {String} key Property key name to search for. Empty string to
* get all properties list .
* @returns {String} Paths to properties from object root.
*/
function getPropertiesByKey(object, key) {
var paths = [
];
iterate(
object,
"");
return paths;
/**
* Single object iteration. Accumulates to an outer 'paths' array.
*/
function iterate(object, path) {
var chainedPath;
for (var property in object) {
if (object.hasOwnProperty(property)) {
chainedPath =
path.length > 0 ?
path + "." + property :
path + property;
if (typeof object[property] == "object") {
iterate(
object[property],
chainedPath,
chainedPath);
} else if (
property === key ||
key.length === 0) {
paths.push(
chainedPath);
}
}
}
return paths;
}
}