我只是想知道是否有人知道一个简单的函数来检查给定的数组是否是多维的,如果可能的话,还会看到它有多少维度。
以下是一个示例数组:
{"name":"Tiradentes","id":"234534gfgdgd4y5hy","areas":{{"name":"Apucarana", "id":"fh4oth98f894nf89h4"},{etc..., etc....}}}
答案 0 :(得分:2)
很简单(我想)简单的函数计数维数在数组和类似数组的对象中(如你的情况):
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
对数组进行天真检查可能会导致多帧应用程序出现棘手的结果,2)$.map
是一个方便的快捷方式所有数组值。
当然,它可以用普通的JS重写,但它不会那么紧凑。 )
必须使用isFinite
检查,protomax
- 空数组会-Infinite
。
答案 1 :(得分:0)
试试这个
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;
}
答案 2 :(得分:0)
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)));
}