• 技术文章 >web前端 >js教程

    JavaScript趣题:多维数组初始化

    黄舟黄舟2017-01-22 15:02:22原创1115
    有时候,我们需要创建一个多维的数组,并将它初始化为我们想要的默认值。

    通常情况下,我们会先创建一个一维数组,接着在这个一维数组内引用二维数组......直到N维数组,然后把它的内容填充为默认值。

    这个过程,我们需要写很多循环,难免有些繁琐,那么,何不想办法写个多维数组初始化的工具方法,方便我们来调用呢?

    我猜你一定想要个这样的方法:

    dim( d1 [,d2 [,d3 [... ]]], value )

    来看它的参数列表,d1,d2,d3代表各个维度数组所引用的元素个数,value代表初始值。

    这个value可能是函数,如果是这种情况,我们就引用函数的返回值。

    来看看几个例子:

    dim( 3,3,"x" ) // => [['x','x','x'],['x','x','x'],['x','x','x']]

    这里一位数组引用了3个二维数组,每个二维数组引用了3个初始化值’x’

    dim( 2,2,2,0 ) // => [[[0,0],[0,0]],[[0,0],[0,0]]]

    这里规则同上

    dim( 3, true ) // => [true,true,true]

    这里一维数组引用了3个boolean值true

    var xxx = function(){ return "xX" }
    dim( 2,5,xxx ) // => [['xX','xX','xX','xX','xX'],['xX','xX','xX','xX','xX']]

    这里初始化值是一个函数,所以我们填充它返回的结果

    这个题目因为涉及到N维的数组,所以需要使用递归。

    它是一个边构建数组,边深度遍历的过程。

    在我的方法中,使用了一个参数deep记录当前的深度。

    比如dim( 2,2,2,0 ),如果当前deep为0,那么就对应第一个参数2,说明要创建2个数组,也就是说,deep的值和参数列表的索引是一致的,代表要构建多少个数组或值。

    如果deep达到了最深,说明可以进行初始化赋值了,for循环填充当前的数组。

    function dim(){  
        var len = arguments.length;  
        var args = Array.prototype.slice.call(arguments,0,len-1);  
        var content = arguments[len-1];  
        var result = [];  
          
        var traverse = function foo(from,deep){  
            var arg = args[deep];  
            if(deep < args.length - 1){  
                for(var i=0;i<arg;i++){  
                    var array = [];  
                    from.push(array);  
                    foo(array,deep+1);  
                }  
            }  
            else{  
                for(var i=0;i<arg;i++){  
                    if(typeof content === "function"){  
                        from.push(content());  
                    }  
                    else{  
                        from.push(content);  
                    }  
                }  
            }  
        };  
        traverse(result,0);  
        return result;  
    }

    以上就是JavaScript趣题:多维数组初始化的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇: JavaScript趣题:丢番图方程 下一篇:JavaScript趣题:链表的归并排序
    Web大前端开发直播班

    相关文章推荐

    • 一文聊聊Angular中的生命周期• 什么是管道?浅析Angular中的管道(PIPE)• 浅析利用node怎么获取mac系统版本• 值得了解的几个实用JavaScript优化小技巧• 一起聊聊JavaScript函数式编程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网