我只是想知道是否有人知道一个简单的函数来检查给定数组是否是多维的,如果可能的话,还要看看它有多少维。
这是一个示例数组:
{"name":"Tiradentes","id":"234534gfgdgd4y5hy","areas":{{"name":"Apucarana", "id":"fh4oth98f894nf89h4"},{etc..., etc....}}}
我只是想知道是否有人知道一个简单的函数来检查给定数组是否是多维的,如果可能的话,还要看看它有多少维。
这是一个示例数组:
{"name":"Tiradentes","id":"234534gfgdgd4y5hy","areas":{{"name":"Apucarana", "id":"fh4oth98f894nf89h4"},{etc..., etc....}}}
相当(我想)简单的函数计算数组和类似数组的对象中的维度(就像你的情况一样):
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) 对 Array 的幼稚检查instanceof Array
可能会导致多帧应用程序中的棘手结果,2)$.map
是移动所有数组值的便捷快捷方式。
当然,它可以用普通的 JS 重写,但不会那么紧凑。)
必须使用isFinite
检查,因为protomax
-ing 一个空数组给出-Infinite
.
试试这个
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;
}
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)));
}