22

多次元配列の次元を取得するには?
編集: 1、2、または 3 次元の可能性がありますが、各サブ配列の長さは同じです。

すなわち

var a = [[1,1,1], [1,1,1]]

[2,3]になります

4

9 に答える 9

29
const dimensions = [ arr.length, arr[0].length ];

length内部配列が変更されないことがわかっている場合、これは機能します。


内部配列の次元が静的でない場合 ( jagged arrayArray.reduce )、結合しMath.maxて最大次元を計算できます。

const dimensions = [
    arr.length,
    arr.reduce((x, y) => Math.max(x, y.length), 0)
];
于 2012-04-19T22:20:22.770 に答える
10

サブリストのサイズが異なる可能性があることを考慮して、最小サイズを取得するか、必要に応じて最大サイズにします

function size(ar){
    var row_count = ar.length;
    var row_sizes = []
    for(var i=0;i<row_count;i++){
        row_sizes.push(ar[i].length)
    }
    return [row_count, Math.min.apply(null, row_sizes)]
}
size([[1, 1, 1], [1, 1, 1]])

出力:

[2, 3]
于 2012-04-19T22:26:39.917 に答える
5

これは、どの次元でも機能します (各サブ配列の長さが同じであると仮定します)。

function getDim(a) {
    var dim = [];
    for (;;) {
        dim.push(a.length);

        if (Array.isArray(a[0])) {
            a = a[0];
        } else {
            break;
        }
    }
    return dim;
}
于 2012-04-20T21:38:28.460 に答える
2
var dim = [
    a.length,
    a[0].length
];

各サブ配列が同じ長さであることを考えると、これはうまくいくはずですが、そうでない場合は、次のようなことをしたいかもしれません:

function findDim(a){
    var mainLen = 0;
    var subLen = 0;

    mainLen = a.length;

    for(var i=0; i < mainLen; i++){
        var len = a[i].length;
        subLen = (len > subLen ? len : subLen);
    }

    return [mainLen, subLen];
};
于 2012-04-19T22:19:43.540 に答える
1

この関数は、配列が有効かどうか (スカラーでも文字列でもないか) をチェックし、その配列の要素が有効かどうか (長さが同じかどうか) をチェックし、すべての条件が満たされている場合は次元を指定し、そうでない場合はエラーをスローします。


function getDim(x){
    dim=[]
    try {
        // throw error if the passed variable is a string or a scalar
        if((isFinite(x) && !x.length) || typeof(x)=='string') throw  'This is a scalar or a string  not an array!';
        // loop over the array to extract length of each element.
        // if we get an element that is not an array, return the found dimensions 
        while (x){

            dim.push(x.length)
            currentLevel=x
            x=Array.isArray(x[0])?x[0]:false;
            // check if all elements of the array are of equal dimention. If not, throw an error
            ans=currentLevel.every((value,index,arr)=>{ return value.length==x.length}) ;
            if(!ans) throw 'elements of the array are not of equal dimension !'

        }
        return dim
    } catch (error) {
        return error 
    }
}

于 2019-08-06T02:07:16.290 に答える
0
var a = [[1,1,1], [1,1,1]];
var size=[];
while(s=a.pop) size.push(s.length);

または、長さを内側にしたい場合a

var a = [[1,1,1], [1,1,1]];
for(i in a) a[i]=a[i].length;

編集:申し訳ありませんが、私は主題に含まれていませんでした。次のコードは、2 次元配列の最大行と最大列を計算します。

var innerSize = 0, i=0, l=a.length, l2;
for(;i<l;i++) if(innerSize<(l2=a[i].length)) innerSize = l2
[l, innerSize]

最小サイズが必要な場合は、<を変更できます。>

于 2012-04-19T22:20:56.517 に答える
0

また、再帰関数を実行して、すべての次元が同一であると仮定して配列の形状を計算することもできます。

arrayShapeRecursive = arr => {
  return arr.length ? [...[arr.length], ...arrayShapeRecursive(arr[0])] : [];
}
于 2020-08-05T13:52:09.263 に答える