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; }
- 写着写着,其实也就为了个很简单的功能而已,居然整出这么几个来,还萌生出将这些保存到mycode.js里了,也没啥不好的吧。想法不都是随时产生的,慢慢积累,慢慢折腾,记录总是个好习惯。说不定以后用得着!!
我的博客地址:http://blog.youkuaiyun.com/gccll
我的github仓库:https://github.com/gcclll