首页 > 解决方案 > 获取对象内所有数组的二维数组

问题描述

我正在尝试将对象中的所有数组放入单独的二维数组中,但是在函数的递归性质方面遇到了麻烦。我能够得到所有的数组,但是我写它的方式,我得到了我不想要的多层嵌套。

下面的代码返回

[
  ["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"]
      ]
    ]
  ]
]

无论对象内的嵌套如何,如何修改getArrays()函数以返回二维数组?

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;
}

标签: javascriptarraysobjectrecursionmultidimensional-array

解决方案


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

testGetArrays();
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));
  console.log(result);
}

function getArrays(object, 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 {
        getArrays(current, result);
      }
    }
  }
  return result;
}


推荐阅读