多次元配列の次元を取得するには?
編集: 1、2、または 3 次元の可能性がありますが、各サブ配列の長さは同じです。
すなわち
var a = [[1,1,1], [1,1,1]]
[2,3]になります
多次元配列の次元を取得するには?
編集: 1、2、または 3 次元の可能性がありますが、各サブ配列の長さは同じです。
すなわち
var a = [[1,1,1], [1,1,1]]
[2,3]になります
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)
];
サブリストのサイズが異なる可能性があることを考慮して、最小サイズを取得するか、必要に応じて最大サイズにします
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]
これは、どの次元でも機能します (各サブ配列の長さが同じであると仮定します)。
function getDim(a) {
var dim = [];
for (;;) {
dim.push(a.length);
if (Array.isArray(a[0])) {
a = a[0];
} else {
break;
}
}
return dim;
}
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];
};
この関数は、配列が有効かどうか (スカラーでも文字列でもないか) をチェックし、その配列の要素が有効かどうか (長さが同じかどうか) をチェックし、すべての条件が満たされている場合は次元を指定し、そうでない場合はエラーをスローします。
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
}
}
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]
最小サイズが必要な場合は、<
を変更できます。>
また、再帰関数を実行して、すべての次元が同一であると仮定して配列の形状を計算することもできます。
arrayShapeRecursive = arr => {
return arr.length ? [...[arr.length], ...arrayShapeRecursive(arr[0])] : [];
}