3 回答

TA贡献1934条经验 获得超2个赞
我为你做了一个情人。我存储一个stack字符串,然后输出,如果该属性是原始类型的:
function iterate(obj, stack) {
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
iterate(obj[property], stack + '.' + property);
} else {
console.log(property + " " + obj[property]);
$('#output').append($("<div/>").text(stack + '.' + property))
}
}
}
}
iterate(object, '')
不要使用,它已被窃听
我最近在这个问题上获得了很多好评,因此我决定使用一些ES2015 +魔术和更多功能的样式来完善该解决方案。
它可能不太可读,但是我喜欢它的外观:)您仍然可以从上面使用一个更简单的解决方案-两者应该完全一样。
const isObject = val =>
typeof val === 'object' && !Array.isArray(val);
const paths = (obj = {}) =>
Object.entries(obj)
.reduce(
(product, [key, value]) =>
isObject(value) ?
product.concat([
[key, paths(value)] // adds [root, [children]] list
]) :
product.concat([key]), // adds [child] list
[]
)
const addDelimiter = (a, b) =>
a ? `${a}.${b}` : b;
const pathToString = ([root, children]) =>
children.map(
child =>
Array.isArray(child) ?
addDelimiter(root, pathToString(child)) :
addDelimiter(root, child)
)
.join('\n');
const input = {
aProperty: {
aSetting1: 1,
aSetting2: 2,
aSetting3: 3,
aSetting4: 4,
aSetting5: 5
},
bProperty: {
bSetting1: {
bPropertySubSetting: true
},
bSetting2: "bString"
},
cProperty: {
cSetting: "cString"
}
};
// ^ implies a "root" level will be ["", paths(input)]
// ideally paths() should return that structure, but I could not figure out how :)
// shows desired output format
console.log(pathToString(["", paths(input)]));
// showcase the resulting data structure
// any object can be recursively represented as a list [objectPropertyName, [...nestedPropertyNames]]
// console.log(paths(input));
添加回答
举报