我有一个函数只有一个变量(foo),那就是:
{
'a': {
'b': {
'c': 12,
'd': 'Hello World'
},
'e': [1,2,3]
}
}
现在我需要将其转换为:
{
'a/b/c': 12,
'a/b/d': 'Hello World',
'a/e': [1,2,3]
}
包括所有属性类型,如函数,true或false,数组,数字,字符串等。
注意:请不要编写实现此目的的代码段,也不要将其提供给我。请给我一些关于我应该使用什么以及算法是什么的提示。然后,如果我无法编写代码,我会告诉您给我代码。
由于
答案 0 :(得分:2)
我会采用递归方法,其中单个调用迭代属性并将键放入数组中,如果值是对象,我将使用实际值再次调用该函数,并使用访问键调用该数组。
function flatKeys(object) {
function iter(part, keys) {
Object.keys(part).forEach(function (k) {
if (part[k] !== null && !Array.isArray(part[k]) && typeof part[k] === 'object') {
return iter(part[k], keys.concat(k));
}
flat[keys.concat(k).join('/')] = part[k];
});
}
var flat = {};
iter(object, []);
return flat;
}
var object = { a: { b: { c: 12, d: 'Hello World' }, e: [1, 2, 3] } };
console.log(flatKeys(object));

答案 1 :(得分:1)
未经测试的代码,但应该让你去
function flatten(obj) {
var retVal = {};
traverse(obj, '');
return retVal;
function traverse(obj, path) {
for (prop in obj) {
if (obj[prop] && typeof(obj[prop]) === 'object')
traverse(obj[prop], path ? path + '/' + prop : prop);
else
retVal[path ? path + '/' + prop : prop] = obj[prop];
}
};
}
var obj = {
a: {
b: {
c: 12,
d: 'Hello World'
},
e: [1,2,3]
}
};
var result = flatten(obj);
result = JSON.stringify(result, null, 2);
$("#result").text(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="result"></pre>
答案 2 :(得分:0)
循环遍历对象的每个键也应该有效。
检查以下代码,以便您可以修改它以满足您的需求
var obj = {
'a': {
'b': {
'c': 12,
'd': 'Hello World'
},
'e': [1,2,3]
}
};
var newObj = {};
var temp = ''
var objectLooper = function(obj, removeParent, parent) {
var objKeys = Object.keys(obj);
for (var i = 0; i< objKeys.length; i++) {
console.log(typeof obj[objKeys[i]])
if (typeof obj[objKeys[i]] === 'object' && typeof obj[objKeys[i]].length === 'undefined'){
//loop again
temp += temp.length > 0 ? '/' + objKeys[i] : objKeys[i];
objectLooper(obj[objKeys[i]], true, objKeys[i])
}else {
//temp += temp.length > 0 ? : objKeys[i];
newObj[temp +'/' + objKeys[i]] = obj[objKeys[i]]
}
}
if(removeParent === true) {
temp = temp.split('/' +parent).join()
}
}
objectLooper(obj)
newObj;