Javascript 获取对象中所有数组的二维数组

Javascript 获取对象中所有数组的二维数组,javascript,arrays,object,recursion,multidimensional-array,Javascript,Arrays,Object,Recursion,Multidimensional Array,我试图将一个对象中的所有数组放在一个单独的二维数组中,但在函数的递归性质方面遇到了问题。我能够得到所有的数组,但按照我编写的方式,我得到了我不想要的多个嵌套级别 下面的代码返回 [ ["1-1","1-2","1-3"], [ ["2-1","2-2","2-3"] ], [ [ ["3-1","3-2","3-3"] ] ], [ [ ["4-1-1","4-1-2","4-1-3"], [

我试图将一个对象中的所有数组放在一个单独的二维数组中,但在函数的递归性质方面遇到了问题。我能够得到所有的数组,但按照我编写的方式,我得到了我不想要的多个嵌套级别

下面的代码返回

[
  ["1-1","1-2","1-3"],
  [
    ["2-1","2-2","2-3"]
  ],
  [
    [
      ["3-1","3-2","3-3"]
    ]
  ],
  [
    [
      ["4-1-1","4-1-2","4-1-3"],
      [
        ["4-2-1-1","4-2-1-2","4-2-1-3"],
        ["4-2-2-1","4-2-2-2","4-2-2-3"]
      ]
    ]
  ]
]
如何修改
getarray()
函数以返回二维数组,而不考虑对象中的嵌套

function testGetArrays() {
  var testObject = {
    "one": ["1-1", "1-2", "1-3"],
    "two": {
      "first": ["2-1", "2-2", "2-3"]
    }, 
    "three": {
      "first": {
        "second": ["3-1", "3-2", "3-3"]
      }
    }, 
    "four": {
      "first": {
        "first": ["4-1-1", "4-1-2", "4-1-3"],
        "second": {
          "first": ["4-2-1-1", "4-2-1-2", "4-2-1-3"],
          "second": ["4-2-2-1", "4-2-2-2", "4-2-2-3"]
        }
      }
    }
  };
  var expectedResult = [
    ["1-1", "1-2", "1-3"],
    ["2-1", "2-2", "2-3"],
    ["3-1", "3-2", "3-3"],
    ["4-1-1", "4-1-2", "4-1-3"],
    ["4-2-1-1", "4-2-1-2", "4-2-1-3"],
    ["4-2-2-1", "4-2-2-2", "4-2-2-3"]
  ];
  var result = getArrays(testObject);
  console.log(JSON.stringify(expectedResult) == JSON.stringify(result));
  console.log(JSON.stringify(result));
}

function getArrays(object) {
  var result = [];
  if (Array.isArray(object)) {
    if (Array.isArray(object[0])) {
      result.push(getArrays(object[0]));
    }
    result.push(object);
  } else {
    for (var i in object) {
      current = object[i];
      if (Array.isArray(current)) {
        result.push(current);
      } else {
        var x = getArrays(current);
        result.push(x);
      }
    }
  }
  return result;
}

最简单的调整是为
getArrays
提供另一个参数
result
,该参数在第一次调用时初始化为空数组,然后递归传递并进行变异:

testGetArrays();
函数testGetArrays(){
var testObject={
“一”:[“1-1”、“1-2”、“1-3”],
“二”:{
“第一”:[“2-1”、“2-2”、“2-3”]
}, 
“三”:{
“第一”:{
“第二个”:[“3-1”、“3-2”、“3-3”]
}
}, 
“四”:{
“第一”:{
“第一”:[“4-1-1”、“4-1-2”、“4-1-3”],
“第二”:{
“第一个”:[“4-2-1-1”、“4-2-1-2”、“4-2-1-3”],
“第二个”:[“4-2-2-1”、“4-2-2-2”、“4-2-2-3”]
}
}
}
};
var expectedResult=[
["1-1", "1-2", "1-3"],
["2-1", "2-2", "2-3"],
["3-1", "3-2", "3-3"],
["4-1-1", "4-1-2", "4-1-3"],
["4-2-1-1", "4-2-1-2", "4-2-1-3"],
["4-2-2-1", "4-2-2-2", "4-2-2-3"]
];
var result=getArrays(testObject);
log(JSON.stringify(expectedResult)==JSON.stringify(result));
log(JSON.stringify(result));
控制台日志(结果);
}
函数getArrays(对象,结果=[])){
if(Array.isArray(对象)){
if(Array.isArray(对象[0])){
push(getArray(对象[0]);
}
结果:推(对象);
}否则{
for(对象中的变量i){
当前=对象[i];
if(数组isArray(当前)){
结果:推送(电流);
}否则{
GetArray(当前、结果);
}
}
}
返回结果;

}
最简单的调整是给
getArrays
另一个参数
result
,该参数在第一次调用时初始化为空数组,然后递归传递并变异:

testGetArrays();
函数testGetArrays(){
var testObject={
“一”:[“1-1”、“1-2”、“1-3”],
“二”:{
“第一”:[“2-1”、“2-2”、“2-3”]
}, 
“三”:{
“第一”:{
“第二个”:[“3-1”、“3-2”、“3-3”]
}
}, 
“四”:{
“第一”:{
“第一”:[“4-1-1”、“4-1-2”、“4-1-3”],
“第二”:{
“第一个”:[“4-2-1-1”、“4-2-1-2”、“4-2-1-3”],
“第二个”:[“4-2-2-1”、“4-2-2-2”、“4-2-2-3”]
}
}
}
};
var expectedResult=[
["1-1", "1-2", "1-3"],
["2-1", "2-2", "2-3"],
["3-1", "3-2", "3-3"],
["4-1-1", "4-1-2", "4-1-3"],
["4-2-1-1", "4-2-1-2", "4-2-1-3"],
["4-2-2-1", "4-2-2-2", "4-2-2-3"]
];
var result=getArrays(testObject);
log(JSON.stringify(expectedResult)==JSON.stringify(result));
log(JSON.stringify(result));
控制台日志(结果);
}
函数getArrays(对象,结果=[])){
if(Array.isArray(对象)){
if(Array.isArray(对象[0])){
push(getArray(对象[0]);
}
结果:推(对象);
}否则{
for(对象中的变量i){
当前=对象[i];
if(数组isArray(当前)){
结果:推送(电流);
}否则{
GetArray(当前、结果);
}
}
}
返回结果;

}
使用递归函数和ES2015:

const collectaries=函数(对象){
if(Array.isArray(对象)){
返回[对象];
}
返回Object.keys(对象).reduce(函数(结果,键){
push(…收集数组(对象[key]))
返回结果;
}, []);
}
var testObject={
“一”:[“1-1”、“1-2”、“1-3”],
“二”:{
“第一”:[“2-1”、“2-2”、“2-3”]
},
“三”:{
“第一”:{
“第二个”:[“3-1”、“3-2”、“3-3”]
}
},
“四”:{
“第一”:{
“第一”:[“4-1-1”、“4-1-2”、“4-1-3”],
“第二”:{
“第一个”:[“4-2-1-1”、“4-2-1-2”、“4-2-1-3”],
“第二个”:[“4-2-2-1”、“4-2-2-2”、“4-2-2-3”]
}
}
}
};

log(collectArrays(testObject))
使用递归函数和ES2015:

const collectaries=函数(对象){
if(Array.isArray(对象)){
返回[对象];
}
返回Object.keys(对象).reduce(函数(结果,键){
push(…收集数组(对象[key]))
返回结果;
}, []);
}
var testObject={
“一”:[“1-1”、“1-2”、“1-3”],
“二”:{
“第一”:[“2-1”、“2-2”、“2-3”]
},
“三”:{
“第一”:{
“第二个”:[“3-1”、“3-2”、“3-3”]
}
},
“四”:{
“第一”:{
“第一”:[“4-1-1”、“4-1-2”、“4-1-3”],
“第二”:{
“第一个”:[“4-2-1-1”、“4-2-1-2”、“4-2-1-3”],
“第二个”:[“4-2-2-1”、“4-2-2-2”、“4-2-2-3”]
}
}
}
};

log(collectArrays(testObject))
创建一个简单的递归函数并检查键的
值。如果它是一个数组,则推送到一个新数组;如果它是一个对象,则调用相同的递归函数

var testObject={
“一”:[“1-1”、“1-2”、“1-3”],
“二”:{
“第一”:[“2-1”、“2-2”、“2-3”]
},
“三”:{
“第一”:{
“第二个”:[“3-1”、“3-2”、“3-3”]
}
},
“四”:{
“第一”:{
“第一”:[“4-1-1”、“4-1-2”、“4-1-3”],
“第二”:{
“第一个”:[“4-2-1-1”、“4-2-1-2”、“4-2-1-3”],
“第二个”:[“4-2-2-1”、“4-2-2-2”、“4-2-2-3”]
}
}
}
};
设newArr=[];
功能获取键(obj){
//迭代对象
用于(让钥匙进入obj){
//检查该值是否为数组
if(Array.isArray(obj[keys])){
//如果是,则将该值推送到另一个数组
新建推送(对象[键])
//如果不是数组,则调用递归函数
}else if(对象的类型[键]=“对象”){
getKeys(对象[keys])
}
}
}
getKeys(testObject);
console.log(newArr)
Cr