【问题标题】:Get size of dimensions in array获取数组中维度的大小
【发布时间】:2012-05-01 12:44:04
【问题描述】:

如何获取给定多维数组的维度?
编辑:它可以是 1、2 或 3 维,但每个子数组的长度相同。

即对于

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

将是 [2,3]

【问题讨论】:

  • 什么是不同大小的子列表?
  • 到目前为止,这是我找到的最佳答案:stackoverflow.com/a/13814933/975097
  • 自从.reduce() 被添加到 Array 原型中,这一直是固定内部长度 (const dimensions = [a.length, a[0].length]) 和不均匀长度 (const dimensions = [a.length, a.reduce((t,e) => Math.max(t, e.length), 0)]) 的单行代码。对于稳定大小的输入,后者产生与第一个相同的答案。

标签: javascript multidimensional-array


【解决方案1】:
const dimensions = [ arr.length, arr[0].length ];

如果您知道 length 的内部数组永远不会改变,这很有效。


如果内部数组的维度不是静态的(jagged array),您可以结合Array.reduceMath.max 来计算最大维度:

const dimensions = [
    arr.length,
    arr.reduce((x, y) => Math.max(x, y.length), 0)
];

【讨论】:

  • "["+arr.length+","+arr[0].length+"]" :)
  • function arraySize(arr){return {c:arr.length, r:arr[0].length === undefined?1:arr[0].length };}
  • 或者,对于不均匀的内部尺寸:dimensions = [ a.length, a.reduce((t,e) => Math.max(t, e.length), 0) ];
【解决方案2】:

考虑到子列表可以有不同的大小,获取最小大小或根据需要使其最大

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]

【讨论】:

  • 这适用于任何维度的数组,还是仅适用于二维数组?
  • @AndersonGreen 它仅适用于二维,但递归调用应使其适用于 N 个维度
【解决方案3】:

这适用于任何维度(假设每个子数组具有相同的长度):

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

        if (Array.isArray(a[0])) {
            a = a[0];
        } else {
            break;
        }
    }
    return dim;
}

【讨论】:

    【解决方案4】:
    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];
    };
    

    【讨论】:

      【解决方案5】:

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

      var Size = a.join(',').split(',').length;
      

      【讨论】:

      • 嗨。尝试详细说明您的解决方案为何有效。
      【解决方案6】:

      此函数将检查数组是否有效(不是标量也不是字符串)以及该数组的元素是否有效(它们具有相同的长度)然后在满足所有条件时给出维度,如果满足则抛出错误否则。

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

      【讨论】:

        【解决方案7】:

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

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

        我创建了Objectprototype method 来确定数组的深度。要使用它,只需调用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;
            }
        }
        

        【讨论】:

          【解决方案8】:
          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]
          

          如果您想要最小尺寸,您可以将&lt; 更改为&gt;

          【讨论】:

            【解决方案9】:

            假设所有维度都相同,您还可以执行递归函数来计算数组的形状:

            arrayShapeRecursive = arr => {
              return arr.length ? [...[arr.length], ...arrayShapeRecursive(arr[0])] : [];
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-05-05
              • 2021-03-16
              • 2014-05-22
              • 2023-04-06
              • 1970-01-01
              • 1970-01-01
              • 2021-03-02
              相关资源
              最近更新 更多