如何获得给定多维数组的维度?
编辑:它可以是1,2或3维,但每个子阵列具有相同的长度。
即。对
var a = [[1,1,1], [1,1,1]]
将是[2,3]
答案 0 :(得分:16)
var dimensions = [ arr.length, arr[0].length ];
这是有效的,因为内部数组的长度永远不会改变。
答案 1 :(得分:7)
考虑到子列表可以具有不同的大小,获得最小大小或根据需要使其最大化
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]
答案 2 :(得分:2)
这适用于任何维度(假设每个子数组具有相同的长度):
function getDim(a) {
var dim = [];
for (;;) {
dim.push(a.length);
if (Array.isArray(a[0])) {
a = a[0];
} else {
break;
}
}
return dim;
}
答案 3 :(得分:1)
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];
};
答案 4 :(得分: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;
编辑: 我道歉,我不在这个问题上。以下代码计算二维数组的最大行和列。
var innerSize = 0, i=0, l=a.length, l2;
for(;i<l;i++) if(innerSize<(l2=a[i].length)) innerSize = l2
[l, innerSize]
如果您想要最小尺寸,可以将<
更改为>
。
答案 5 :(得分:0)
此函数将检查数组是否有效(不是标量或字符串),并且该数组的元素是否有效(它们的长度相同),如果满足所有条件,则给出尺寸,否则,将引发错误其他。
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
}
}
答案 6 :(得分:0)
此外,您还可以做一个递归函数来计算数组的形状,假设所有维度都相同:
arrayShapeRecursive = arr => {
return arr.length ? [...[arr.length], ...arrayShapeRecursive(arr[0])] : [];
}
答案 7 :(得分:0)
您可以使用arr.length
和arr[0].length
来查找宽度和深度。
通常,数组的深度是可变的,因此有必要使用递归遍历整个数组。
我创建了prototype method
中的Object
,以确定数组的深度。要使用它,只需调用myArray.dimensionsDeep()
。它适用于Objects
和Arrays
。
Object.prototype.isMultidimensional = function()
{
return this.constructor.name !== "String" && Object.keys(this).some((i) => { return this[i].length > 0; });
}
Object.prototype.dimensionsDeep = function()
{
if (typeof Object.dimensions === 'undefined')
{
if (!this.length)
return 0;
Object.dimensions = 0;
Object.currentLevel = 0;
}
Object.keys(this).forEach((i) =>
{
if (this[i].isMultidimensional())
{
Object.currentLevel++;
if (Object.currentLevel > Object.dimensions)
Object.dimensions = Object.currentLevel;
this[i].dimensionsDeep();
}
});
Object.currentLevel--;
if (Object.currentLevel < 0)
{
delete(Object.currentLevel);
var temp = Object.dimensions;
delete(Object.dimensions);
return temp + 1;
}
}
答案 8 :(得分:0)
获取多维数组的元素个数就是这么简单...
var Size = a.join(',').split(',').length;