【发布时间】:2016-11-16 16:34:21
【问题描述】:
我已经在这个解决方案上编写了几个小时,但似乎无法再取得太大进展。这是一个很难编写的函数。这是我的意见:
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并通过引用来自testObj的每个其他元素来获取每个成员当前的flatTestObj 索引数组值。
这是我目前所拥有的,但我很难让它与嵌套一起工作:
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, []);
【问题讨论】:
标签: javascript arrays json algorithm flatten