寻找一个 JavaScript 数组的维度

7

如何编写一个函数,以最高效或最易读的方式接受一个数组并返回该数组的多维度量。目前可以假设这些数组仅包含基本类型。

示例:

    var arr = [[1,2],[3,4],[5,6]]

    function findDim(a){
    //logic goes here
    }

    findDim(arr); // returns 2

1
这个是多少维度的:[ 1, [2,3], [[4]] ] - georg
我们可以说这个函数应该计算最大维度 - 因此是3。 - gilmatic
3个回答

9
使用递归和 Array.isArray 方法来检查元素是否为数组。

var arr = [
  [1, 2],
  [3, 4],
  [5, 6]
];

function findD(arr) {
  // check the element is an array then do 
  // recursion to check it's element
  if (Array.isArray(arr)) {
    return 1 + findD(arr[0]);
  }
  // else return `0` since it's not
  // a nested array
  return 0;
}

console.log(findD(arr));


注意:对于旧版本的浏览器,请检查 Array.isArray 方法的 polyfill 选项


更新:如果它包含不同维度的数组并且您想要获取更深层次的维度,则使用Array#mapMath.max方法。

var arr = [
  [1, 2],
  [3, 4],
  [5, [6]]
];

function findD(arr) {
  // return 0 if not array else return the max value 
  // by finding all elements dimension
  return Array.isArray(arr) ?
    // generate the dimension value array 
    1 + Math.max.apply(Math, arr.map(findD)) : 0;
}

console.log(findD(arr));


或者使用Array#reduce方法来获取最大值。

var arr = [
  [1, 2],
  [3, [4,[[3]]]],
  [5, [6]]
];

function findD(arr) {
  // return 0 if not array else return the max value 
  // by finding all elements dimension
  return Array.isArray(arr) ? 1 + arr.reduce(function(a, b) {
    // get the largest by comparing all the adjuscent 
    // elements dimension
    return Math.max(a, findD(b));
  }, 0) : 0;
}

console.log(findD(arr));


1
现在它好多了。 - Redu
1
function(v) { return findD(v) } 虽然看起来没有太多意义。 - georg

2

对于不是矩阵的js数组,“维度”没有明确定义,这里有一个函数来找到数组的最大“深度”:

maxDepth = x => Array.isArray(x)
  ? 1 + Math.max.apply(this, x.map(maxDepth))
  : 0
;

console.log(maxDepth([[1,2],[3,4],[5,6]]))
console.log(maxDepth([[[[1]]], 2]))


这是唯一一个可行的答案(好吧..还有我的-:)) - Redu
@Redu:嗯,OP没有说他们(或他们的老师)想如何处理不规则数组...不太确定这里什么更“正确”。 - georg

1
这是我会做的方法。它适用于不规则多维数组。

var arr = [[1,2],[3,4],[5,[6,[7,[8]]]]],
findDim = a => Math.max(...a.map(e => Array.isArray(e) ? findDim(e) : 0)) + 1
console.log(findDim(arr))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接