在Javascript中获取对象中的所有命名空间?

时间:2017-05-19 09:27:21

标签: javascript

我有一个深层嵌套的对象: java.util.zip.ZipException: invalid distance too far back

如何在此对象中获取所有命名空间?

所以,我需要得到: { a: { b: { c: 3 }, d: 4 } }

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...inObject.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; }