【问题标题】:jQuery: function to check if array is multidimentionaljQuery:检查数组是否是多维的函数
【发布时间】:2013-05-07 14:48:39
【问题描述】:

我只是想知道是否有人知道一个简单的函数来检查给定数组是否是多维的,如果可能的话,还要看看它有多少维。

这是一个示例数组:

{"name":"Tiradentes","id":"234534gfgdgd4y5hy","areas":{{"name":"Apucarana", "id":"fh4oth98f894nf89h4"},{etc..., etc....}}}

【问题讨论】:

    标签: javascript jquery arrays multidimensional-array


    【解决方案1】:

    相当(我想)简单的函数计算数组和类数组对象中的维度(就像你的情况一样):

    function countDimensions(arr)
    {
      if (! (arr && typeof arr === 'object') ) {
        return 0;
      }
      var maxCount = Math.max.apply(null, $.map(arr, function(n) {
        return countDimensions(n);
      }));
      return 1 + (isFinite(maxCount) ? maxCount : 0);
    }
    

    使用 jQuery,因为 0) 它在标签中被提及,1) 使用 instanceof Array 对 Array 进行天真检查可能会导致多帧应用程序中的棘手结果,2) $.map 是在所有 数组值。

    当然可以用纯 JS 重写,但不会那么紧凑。 )

    必须使用isFinite 检查,因为protomax-ing 一个空数组给出-Infinite

    【讨论】:

    • 只是一个简单的问题。我只是在我的二维数组上使用它,它返回 1。它从 0 开始吗​​?
    • 你能举一个你的数组的例子吗?
    • 所以,我从 $.ajax 调用中获取我的数组,该调用发布到 PHP 页面并返回一个 json 数组。该数组或多或少如下: {"name":"Tiradentes","id":"234534gfgdgd4y5hy",{{"name":"Apucarana", "id":"fh4oth98f894nf89h4"},{etc...等....}}}
    • 啊,正如我所怀疑的那样。你从 PHP 中得到的不是一个数组:它是一个对象。您仍然可以使用此功能(通过更新),但这些 - 数组和对象 - 是完全不同的野兽。
    • 啊……谢谢!我认为这是一个 json array
    【解决方案2】:

    试试这个

    var dims = 0;
    function getArrayDimensions(arr) {
     if(typeof(arr) != 'array') return false;
     for(var i = 0; i < arr.length; i++) {
       if(typeof(arr[i]) == 'array') dims++;
       dims += getArrayDimensions(arr[i]);
     }
     return dims;
    }
    

    【讨论】:

    • 哎呀,不!有谁赞成这个阅读代码或尝试过吗?显然不是,它被错误所驾驭。
    • 提示:typeof [] => 'object'
    【解决方案3】:

    JavaScript 数组并不是真正的多维数组,它们是可以包含不同数据类型的列表。所以你只能通过测试你的数组包含另一个数组的频率来确定数组的深度:

    var isArray = Array.isArray || function(a) {
        return a instanceof Array || Object.prototype.toString.call(a) == "[object Array]";
    };
    
    function getDepth(o) {
        for (var i=0; isArray(o); o=o[0])
            i++;
        return i;
    }
    

    一个更具限制性的实现将计算数组的 所有 个槽包含其他数组的级别,而不是只检查第一个。例如,[[], 0] 的结果会有所不同。

    function getDepth(o) {
        if (!isArray(o))
            return 0;
        return 1 + (o.length && Math.min.apply(null, o.map(getDepth)));
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 2010-09-26
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2018-06-01
      • 2018-01-05
      相关资源
      最近更新 更多