如何获取多维Javascript数组的维度?

时间:2012-12-11 06:10:23

标签: javascript arrays

通常情况下,我需要确定Javascript数组是否为矩形(并获取数组的尺寸)。在这种情况下,我的意思是确定数组的每个元素是否是具有相同长度的数组。我怎么能这样做?

function getArrayDimensions(theArray){
    //if the array's dimensions are 3x3, return [3, 3], and do the same for arrays of any dimension
    //if the array is not rectangular, return false
}

此外,如何将此函数推广到多维数组(2x5x7,3x7x8x8等)?

6 个答案:

答案 0 :(得分:9)

此递归函数返回给定数组的所有维度,如果一个或多个维度不是直的(即数组项目之间的大小不同),则返回false。它使用辅助函数来确定两个简单数组是否相同(在使用之前阅读函数注释)。

// pre: a !== b, each item is a scalar
function array_equals(a, b)
{
  return a.length === b.length && a.every(function(value, index) {
    return value === b[index];
  });
};

function getdim(arr)
{
  if (/*!(arr instanceof Array) || */!arr.length) {
    return []; // current array has no dimension
  }
  var dim = arr.reduce(function(result, current) {
    // check each element of arr against the first element
    // to make sure it has the same dimensions
    return array_equals(result, getdim(current)) ? result : false;
  }, getdim(arr[0]));

  // dim is either false or an array
  return dim && [arr.length].concat(dim);
}

console.log(getdim(123)); // []
console.log(getdim([1])); // [1]
console.log(getdim([1, 2])); // [2]
console.log(getdim([1, [2]])); // false
console.log(getdim([[1, 2], [3]])); // false
console.log(getdim([[1, 2],[1, 2]])); // [2, 2]
console.log(getdim([[1, 2],[1, 2],[1, 2]])); // [3, 2]

console.log(getdim([[[1, 2, 3],[1, 2, 4]],[[2, 1, 3],[4, 4, 6]]])); // [2, 2, 3]

console.log(getdim([[[1, 2, 3], [1, 2, 4]], [[2, 1], [4, 4]]])); // false

答案 1 :(得分:2)

这是一个简单的递归函数。写得很快,所以可能容易出错。

此函数返回每个维度的长度。如果它包含不同长度的子数组,则此函数返回false。

此功能适用于不同的尺寸。

例如,传递2x3的2d数组将返回[2, 3],2x3x4的3d数组将返回[2, 3, 4]。可以通过检查返回数组的长度来获得维度(即 n d)。

// Array dimension checker
// Returns:
//   false when array dimensions are different
//   an Array when is rectangular 0d (i.e. an object) or >=1d
function arrayDimension(a) {
    // Make sure it is an array
    if (a instanceof Array) {
        // First element is an array
        var sublength = arrayDimension(a[0]);
        if (sublength === false) {
            // Dimension is different
            return false;
        } else {
            // Compare every element to make sure they are of the same dimensions
            for (var i = 1; i < a.length; i++) {
                var _sublength = arrayDimension(a[i]);
                // HACK: compare arrays...
                if (_sublength === false || sublength.join(",") != _sublength.join(",")) {
                    // If the dimension is different (i.e. not rectangular)
                    return false;
                }
            }
            // OK now it is "rectangular" (could you call 3d "rectangular"?)
            return [a.length].concat(sublength);
        }
    } else {
        // Not an array
        return [];
    }
}

Demo(检查javaScript控制台:))

答案 2 :(得分:1)

如何使用Array.every

示例:

var firstLen = ar[0].length;

var isRectangular = ar.every(function(item) {
return item.length == firstLen;
}

答案 3 :(得分:1)

function isRectangular(arr){
    for(x in arr){
        if(arr[x+1].length != arr[x].length)
            return false;
    }
    return true;
}

更多维度:

function isPrismatic(arr){
    for(x in arr){
        if(typeof arr[x] == "object" && arr[x+1].length == arr[x].length)
            return isPrismatic(arr[x]);
        else if(arr[x].length != arr[x+1].length)
            return false;
    } return true;
}

答案 4 :(得分:1)

简单的实现是检查所有内部数组是否与外部数组具有相同的长度:

function isSquare(arr) {
  var len = arr.length;

  for (var i=0; i<len; i++) {

    if (arr[i].length != len) {
      return false;
    }
  }
  return true;
}

这样:

isSquare([[1,2],[3,4]]);   // true
isSquare([[1,2],[3,4,5]]); // false

修改

如果你想要“矩形”数组,其中每个成员数组的长度相同但不一定与外部数组的长度相同:

function isRectangleArray(arr) {
  var len = arr[0].length;

  for (var i=0, iLen=arr.length; i<iLen; i++) {

    if (arr[i].length != len) {
      return false;
    }
  }
  return true;
}

我不确定你如何定义一个多维“矩形”数组,除了说它们必须都具有相同的长度。你可以通过一个循环遍历成员的函数来做到这一点,如果它是一个数组数组,递归调用自身直到它得到一个非数组的数组,然后调用类似isRectangularArray的函数并传递长度来检查

答案 5 :(得分:0)

我是这样做的,如果你知道这个可能的尺寸那么轻:

//If i want to test if 2x2 or 3x3
if (typeof(array[0][0][0]) == "undefined")
{
  //stuff for array 3x3
}
else
{
  //stuff for array 2x2
}