Javascript算法练习(五)

Javascript算法练习(五)

荒废里几个星期没学习了,还是要持之以恒才行,这次小问题一个,弄了几个小函数,本来目的很简单,就是想从数组中找出最大值和最小值,然后将这两个值之间的数相加起来。本来挺简单的事情,写着写着需要考虑的事情就越多……,记录下^_^!!!

  • sumAllBetweenMinToMax(__arr),主要就这个函数了,下面的都是为它服务的,貌似服务很周到 - -!

    // ------------- 是不是很暴力,直接贴代码 --------------------  
    /**
     * 4. 数组中最大值和最小值之间的所有数的和
     * 传入的合法参数的几种情况
     * 1) 数组只有一个数字型元素,直接返回该元素
     * 2) 数组有两个数字型元素,比较取最大值和最小值,创建数组将其之间的值相加
     * 3) 数组超过两个数字型元素,找出最大和最小值,进行第二步
     * 4) 其他情况,即数组中可能有非数字型的元素(如:对象,字符串等待),需要过滤
     * @param  {[type]} __arr [description]
     * @return {[type]}       [返回数组中最小值与最大值之间所有数值的和]
     */
    function sumAllBetweenMinToMax( __arr ) {
    
        var arr             = __arr,
            maxAndMinArr    = [],
            targetArr       = [],
            tmpArr          = null;
    
        // 参数错误
        if ( argumentErrorHandler(__arr) ) return;
    
        // 1. 只有一个元素,且元素是数值,直接返回该值
        if ( arr.length == 1 && !isNaN(arr[0]) ) return arr[0]; 
    
        // 2. 如果只有两个元素,且两个元素的值相同,直接返回该值
        if ( arr.length == 2 && arr[0] == arr[2] ) return arr[0] + arr[1];
    
        // 3. 取出数组中最大值和最小值
        tmpArr       = splitArrayToEleInArray( arr ); // 取出的数组中只包含普通元素,不包含数组
        maxAndMinArr = getMaxAndMinFromArray( tmpArr );
    
        var max = maxAndMinArr[0],
            min = maxAndMinArr[1];
        // 把min -> max之间的数及其自身保存到数组中
        for ( var i = min; i < max + 1; i++ ) {
            targetArr.push(i);
        }
    
        // 遍历数组
        // reduce的使用:
        // arr.reduce(callback[, initValue]);
        // callback: function(preV, curV, curIdx, array){}
        // preV: 如果与数组中的第一个值相同,则作为第一个值,会影响curV的值和索引
        //       如果与数组中第一个值不相同,则作为基准值,不会影响curV的值和索引,且curV的值和索引都是数组中第一个元素对应的值和索引
        // curV:如上,受preV影响
        // curIdx: 如上,为curV的值在数组中的索引值
        // array:当前数组
        var total = targetArr.reduce(function (preV, curV, curIdx, array) {
            return preV + curV;
        }, 0);
    
        return total;
    }
    
  • argumentErrorHandler: 错误处理函数,想整个统一的错误处理(貌似有点想多了,Σ( ° △ °|||)︴)

    // 1. 参数判断,错误返回
    // __type: [TODO]
    //      == 0 : 数值
    //      == 1 : 字符串
    //      == 2 : 数组
    //      == 3 : 对象
    function argumentErrorHandler( __args, __type ) {
        if ( !isArrayObj(__args) || !__args || __args.length <= 0 ) {
            console.log("ERROR: not array or empty array, please check your arguments... !");
            return true;
        }
    
        return false;
    }
  • splitArrayToEleInArray,搞定参数问题就这个了,就是将数组中元素为数组的元素原地拆分合并到原数组

    function splitArrayToEleInArray( __arr ) {
        // 参数错误
        if ( argumentErrorHandler(__arr) ) return;
    
        var oneDimenArr     = [];
    
        // 遍历数组,递归合并数组
        __arr.forEach( function(element, index) {
            if ( isArrayObj(element) ) { // 元素为数组
                oneDimenArr = oneDimenArr.concat( element ); // 如果是数组,直接合并
            } else if ( isObject(element) ) {
                // 如果是对象就跳过,差点忘掉你了 - -!
            } else {
                oneDimenArr.push( element );
            }
        });
    
        // 数组中有元素为数组,递归继续执行合并操作,否则直接返回当前处理后的数组oneDimenArr
        return hasArray( oneDimenArr ) ? splitArrayToEle( oneDimenArr ) : oneDimenArr;
    }
  • getMaxAndMinFromArray,这个是从数组中拿到最大值和最小值(仅数值型哦,什么字符串对象数组,统统无视啦)

    /**
     * 2. 获取数组中的最大值和最小值, 跳过非数字型元素
     * @param  {[type]} __arr [description]
     * @return {[type]}       [返回包含两个元素的数组,第一个为最大值,第二个为最小值]
     */
    function getMaxAndMinFromArray( __arr ) {
    
        // 参数错误
        if ( argumentErrorHandler(__arr) ) return;
    
        var max = __arr[0],
            min = __arr[0];
    
        __arr.forEach( function(element, index) {
    
            // 是数字的情况下才去找,同时可以过滤非数字型的元素
            if ( !isNaN(element) ) {
                element = parseInt(element);
                max = element > max ? element : max;
                min = element < min ? element : min;
            }
        });
    
        return [max, min];
    }
  • hasArray,这个就不解释了吧,就是判断数组中是否还有数组元素啦,嘴真贱!!!

    /**
     * 1. 判断数组中是否存在数组类型的元素
     * @param  {[type]}  __arr [description]
     * @return {Boolean}       [true: 存在数组类型元素,false:不存在数组型元素]
     */
    function hasArray( __arr ) {
    
        if ( argumentErrorHandler(__arr) ) return;
    
        for (var i = 0; i < __arr.length; i++ ) {
            if ( isArrayObj(__arr[i]) ) return true;
        }
    
        return false;
    }
    1. 写着写着,其实也就为了个很简单的功能而已,居然整出这么几个来,还萌生出将这些保存到mycode.js里了,也没啥不好的吧。想法不都是随时产生的,慢慢积累,慢慢折腾,记录总是个好习惯。说不定以后用得着!!

我的博客地址:http://blog.csdn.net/gccll

我的github仓库:https://github.com/gcclll

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若叶岂知秋vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值