6

多くの場合、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 など) に一般化するにはどうすればよいですか?

4

6 に答える 6

10

この再帰関数は、指定された配列のすべての次元を返すか、1 つ以上の次元が直線でない場合 (つまり、配列項目間でサイズが異なる場合) に false を返します。ヘルパー関数を使用して、2 つの単純な配列が同じかどうかを判断します (使用する前に関数のコメントを読んでください)。

// 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

于 2012-12-12T02:50:23.463 に答える
2

これを行うための単純な再帰関数を次に示します。非常に急いで書いたので、エラーが発生しやすい可能性があります。

この関数は、各次元の長さを返します。長さが異なるサブ配列が含まれている場合、この関数は false を返します。

この関数は、さまざまな次元で機能します。

たとえば、2x3 の 2[2, 3]次元配列を渡すと が返され、2x3x4 の 3 次元配列を渡すと が返され[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 [];
    }
}

デモ(javaScript コンソールを確認してください:))

于 2012-12-11T06:39:27.867 に答える
1

を使ってみてはいかがでしょうかArray.every

例:

var firstLen = ar[0].length;

var isRectangular = ar.every(function(item) {
return item.length == firstLen;
}
于 2012-12-11T06:14:31.000 に答える
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;
}
于 2012-12-11T06:17:28.533 に答える
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;
}

多次元の「長方形」配列をどのように定義するかは、すべて同じ長さでなければならないと言う以外にわかりません。メンバーをループする関数を持つことでそれを行うことができます。それが配列の配列である場合は、配列以外の配列を取得するまで再帰的に自分自身を呼び出し、次にisRectangularArraylike 関数を呼び出してチェックする長さを渡します。

于 2012-12-11T06:36:25.327 に答える