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内部数组永远不会改变,这很有效。


如果内部数组的维度不是静态的(锯齿状数组),您可以组合Array.reduceMath.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 回答
2

获取多维数组的元素个数就这么简单...

var Size = a.join(',').split(',').length;
于 2021-05-18T00:30:10.290 回答
1

在您的情况下,您可以简单地使用arr.lengtharr[0].length找到宽度和深度。

通常,数组将具有可变的深度,这使得有必要使用递归遍历整个数组。

我创建了一个prototype methodObject确定数组的深度。要使用它,只需调用myArray.dimensionsDeep(). 它适用于ObjectsArrays

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;
    }
}
于 2020-10-25T22:27:50.247 回答
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;

编辑:对不起,我不在主题中。以下代码计算二维数组的最大行和列。

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 回答