我想知道是否可以检索javascript对象包含的所有路径
示例:
obj = {
prop1 : {
x: 19
y: 43
}
prop2 : {
another: {
here: 1
}
}
prop3: "hello"
}
结果将是包含以下元素的数组:
Result: ["prop1.x", "prop1.y", "prop2.another.here", "prop3"]
这可能吗?
谢谢!
答案 0 :(得分:3)
function flattenKeys(obj, delimiter) {
delimiter = delimiter || '.';
return recurse(obj, '', []);
function recurse(obj, path, result) {
if (typeof obj === "object") {
Object.keys(obj).forEach(function (key) {
recurse(obj[key], path + delimiter + key, result);
});
} else {
result.push(path.slice(delimiter.length));
}
return result;
}
}
用作
var obj = {
prop1 : {
x: 19,
y: 43
},
prop2 : {
another: {
here: 1
}
},
prop3: "hello"
};
flattenKeys(obj);
// -> ["prop1.x", "prop1.y", "prop2.another.here", "prop3"]
没有字符串操作的替代实现:
function flattenKeys(obj, delimiter) {
delimiter = delimiter || '.';
return recurse(obj, [], []);
function recurse(obj, path, result) {
if (typeof obj === "object") {
Object.keys(obj).forEach(function (key) {
path.push(key);
recurse(obj[key], path, result);
path.pop();
});
} else {
result.push(path.join(delimiter));
}
return result;
}
}
答案 1 :(得分:2)
在Tomalak聚集在这里的时候写下了这个。递归是实现这一目标的明显方法。
var inputObject = {
prop1: {
x: 19,
y: 43
},
prop2: {
another: {
here: 1
}
},
prop3: "hello"
};
function getProps(obj) {
var props = [];
var findPropsRecursive = function (robj, str) {
robj = robj || {};
var keys = Object.keys(robj);
if (keys.length > 0 && (robj instanceof Object)) {
return keys.map(function (key) {
return findPropsRecursive(robj[key], str + (str ? '.' : '') + key);
});
} else {
props.push(str);
return '';
}
};
findPropsRecursive(obj, '');
return props;
}
console.log(getProps(inputObject));
on jsfiddle:http://jsfiddle.net/jkoudys/w49rcp40/