我有一个深层嵌套的对象:
java.util.zip.ZipException: invalid distance too far back
。
如何在此对象中获取所有命名空间?
所以,我需要得到:
{ a: { b: { c: 3 }, d: 4 } }
。
答案 0 :(得分:4)
您可以使用for...in
循环创建递归函数。
var obj = {a: {b: {c: 3} }, d: 4 }
function getKeys(data, prev) {
var result = []
for (var i in data) {
var dot = prev.length ? '.' : '';
if (typeof data[i] == 'object') result.push(...getKeys(data[i], prev + dot + i))
else result.push(prev + dot + i)
}
return result;
}
console.log(getKeys(obj, ''))
您可以使用for...in
和Object.keys()
代替reduce()
循环。
var obj = {a: {b: {c: 3} }, d: 4 }
function getKeys(data, prev) {
return Object.keys(data).reduce(function(r, e) {
var dot = prev.length ? '.' : '';
if (typeof data[e] == 'object') r.push(...getKeys(data[e], prev + dot + e))
else r.push(prev + dot + e)
return r;
}, [])
}
console.log(getKeys(obj, ''))
答案 1 :(得分:3)
{{1}}
答案 2 :(得分:1)
您可以创建一个脚本以展平对象并返回键。您还可以考虑将其转换为数组并使用默认的flatten
数组。这是一个展平对象的例子。
var flattenObject = function(ob) {
var toReturn = {};
for (var i in ob) {
if (!ob.hasOwnProperty(i)) continue;
if ((typeof ob[i]) == 'object') {
var flatObject = flattenObject(ob[i]);
for (var x in flatObject) {
if (!flatObject.hasOwnProperty(x)) continue;
toReturn[i + '.' + x] = flatObject[x];
}
} else {
toReturn[i] = ob[i];
}
}
return toReturn;
};
var obj = {a: {b: {c: 3} }, d: 4 }
console.log(Object.keys(flattenObject(obj))); // ['a.b.c', 'd']
P.S。你问题中的对象有错误,或者你想要的不是你所要求的。 d与a的级别相同,因此无法实现“a.d”,而是“d”
答案 3 :(得分:0)
您可以检查密钥并迭代,否则将路径推送到结果集。
function getKeys(object) {
function iter(o, p) {
var keys = Object.keys(o);
keys.length ?
keys.forEach(function (k) { iter(o[k], p.concat(k)); }):
result.push(p.join('.'));
}
var result = [];
iter(object, []);
return result;
}
var object = { a: { b: { c: 3 } }, d: 4 };
console.log(getKeys(object));
.as-console-wrapper { max-height: 100% !important; top: 0; }