Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将嵌套JavaScript对象转换为平面数组?_Javascript_Arrays_Json_Algorithm_Flatten - Fatal编程技术网

如何将嵌套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,看起来有人在你做这个时回答了。希望它能帮助别人。不管怎样,我还是选了你!