如何将嵌套JavaScript对象转换为平面数组?
我已经为这个解决方案编写了几个小时的代码,似乎再也没有什么进展了。这是一个很难写的函数。以下是我的意见:如何将嵌套JavaScript对象转换为平面数组?,javascript,arrays,json,algorithm,flatten,Javascript,Arrays,Json,Algorithm,Flatten,我已经为这个解决方案编写了几个小时的代码,似乎再也没有什么进展了。这是一个很难写的函数。以下是我的意见: var testObj = { 'b': 'num', 'a': { 'd': 'num', 'c': 'num' }, 'g': ['num', 'num', { 'x': 'num', 'y': 'num' }], 'e': 'num' }; 下面是我试图从上面生成的输出: var flatTestObj = [ ['b',
var testObj = {
'b': 'num',
'a': {
'd': 'num',
'c': 'num'
},
'g': ['num', 'num', {
'x': 'num',
'y': 'num'
}],
'e': 'num'
};
下面是我试图从上面生成的输出:
var flatTestObj = [
['b', 'num'],
['a', 'obj'],
['a', 'obj', 'd', 'num'],
['a', 'obj', 'c', 'num'],
['g', 'arr'],
['g', 'arr', 0, 'num'],
['g', 'arr', 1, 'num'],
['g', 'arr', 2, 'obj'],
['g', 'arr', 2, 'obj', 'x', 'num'],
['g', 'arr', 2, 'obj', 'y', 'num'],
['e', 'num']
];
(稍后我也将按字母顺序排列键,但我可以自己处理这一部分,因此我从问题中排除了这一部分,以便更容易回答)但问题的关键是要保证稍后以相同的顺序遍历这种格式的对象
基本上,让它递归地遍历对象,并将每个键/索引映射作为新元素添加到flatTestObj
,以便稍后您可以迭代flatTestObj
,并通过引用当前flatTestObj
索引数组值中的每个其他元素来获取testObj
中的每个成员
以下是迄今为止我所掌握的,但我很难让它与嵌套一起工作:
var flattened = [];
function flatten(json, acc) {
var keys = Object.keys(json);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var val = json[key];
var strVal = typeof val === 'object' ? 'obj' : val;
if (acc.length === 0) {
acc = [key, strVal];
} else {
acc = acc.concat([key, strVal]);
}
if (typeof val === 'object') {
flatten(val, acc);
} else {
flattened.push(acc);
acc = [];
}
}
}
flatten(testObj, []);
var=[];
函数展平(json、acc){
var keys=Object.keys(json);
对于(变量i=0;i
这将提供您要查找的输出:
var flattened = [];
function flatten(json, acc, inArray) {
var key;
acc = acc || [];
for(key in json) {
if(inArray) {
key = +key; //coerce to number
}
if(json[key] instanceof Array) {
flattened.push(acc.concat([key, 'arr']));
flatten(json[key], acc.concat([key, 'arr']), true);
}
else if(json[key] instanceof Object) {
flattened.push(acc.concat([key, 'obj']));
flatten(json[key], acc.concat([key, 'obj']));
}
else {
flattened.push(acc.concat(key, json[key]));
}
}
} //flatten
基本上,每次推到展平的数组时,都需要包含acc.concat()
var testObj={
“b”:“num”,
“a”:{
“d”:“num”,
“c”:“num”
},
'g':['num','num'{
“x”:“num”,
“y”:“num”
}],
“e”:“num”
};
var=[];
函数展平(json、acc、inArray){
var键;
acc=acc | |[];
for(输入json){
如果(inArray){
key=+key;//强制为数字
}
if(json[key]instanceof数组){
压平。推(根据concat([键,'arr']);
扁平化(json[key],acc.concat([key,'arr']),true);
}
else if(json[key]instanceof Object){
压平。推(根据concat([键,'obj']);
扁平化(json[key],acc.concat([key,'obj']);
}
否则{
flatted.push(acc.concat(key,json[key]);
}
}
}//变平
展平(testObj);
log(JSON.stringify(flatted))代码>这里有一种使用递归函数调用的方法
var testObj={
“b”:“num”,
“a”:{
“d”:“num”,
“c”:“num”
},
'g':['num','num'{
“x”:“num”,
“y”:“num”
}],
“e”:“num”
};
var flatTestObj=(函数it(what、arr、chain){
如果(什么的类型==“对象”){
var fn=函数(k){
var type=Array.isArray(what[k])?“arr”:“obj”,
vArr=[k,typeof what[k]==“object”?type:what[k],
fArr=链浓度(vArr);
arr.push(fArr);
它(什么[k],arr,fArr);
}
if(Array.isArray(what))for(var i in what)fn(i)
else对象.keys(what).forEach(fn);
}
返回arr;
})(testObj,[],[]);
document.body.innerHTML=''+JSON.stringify(flatTestObj,0,4)+''代码>漂亮!太简单了!非常感谢你!我打算研究一下这个,但它看起来很完美!除了数组标记在展平数组中被设置为字符串,但我想我能找到解决方法。Eeek,看起来有人在你做这个时回答了。希望它能帮助别人。不管怎样,我还是选了你!