Javascript算法练习(六)
2016-07-29 18:21
459 查看
Javascript算法练习(六)
diffArray:取出两个数组中非共有的元素,组合成新数组返回
练习filter的使用较简单的方法就是调用filter去过滤出两个数组中彼此不存在的元素
filter + concat
/** * 获取两个数组中非共有部分 * @param {[type]} arr1 [description] * @param {[type]} arr2 [description] * @return {[Array]} 返回两个数组中非共有部分组成的新数组 */ function diffArray(arr1, arr2) { if ( !arr1 || !arr2 ) return; // 过滤arr1中共有部分 var arr1Diff = arr1.filter(function(value){ return arr2.indexOf(value) == -1; }); // 过滤arr2中共有部分 var arr2Diff = arr2.filter(function(value){ return arr1.indexOf(value) == -1; }); // 连接两个非共有数组 return arr1Diff.concat(arr2Diff); }
convertToRoman: 将阿拉伯数字转换成罗马数字表示形式,支持范围(1-3999)
思路:取出数字各个位的数字(千位,百位,十位,个位),然后减一之后,当作罗马数字字符串数字下表去取相对应的罗马数字表示形式,最后组合成字符串,即得到阿拉伯数字对应的罗马数字表示形式。/** * 将1 - 3999数字转成罗马数字表示形式,如: * @param {[type]} num [description] * @return {[type]} [description] */ function convertToRoman( number ) { // 数字范围限制 if ( number >= 4000 || number <= 0 ) { console.log( number + " is not between 1 and 3999, please check your number !" ); return; } var romaStr = ""; var thousand = parseInt(number / 1000), // 千位数 hundred = parseInt(number % 1000 / 100), // 百位数 ten = parseInt(number % 1000 % 100 / 10), // 十位数 single = parseInt(number % 1000 % 100 % 10); // 个位数 console.log("thousand = " + thousand + ", hundred = " + hundred + ", ten = " + ten, ", single = " + single); if ( thousand > 0 ) romaStr += ["M", "MM", "MMM"][thousand - 1]; if ( hundred > 0 ) romaStr += ["C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"][hundred - 1]; if ( ten > 0 ) romaStr += ["X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"][ten - 1]; if ( single > 0 ) romaStr += ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"][single - 1]; return romaStr; } // 测试结果: convertToRoman(3425) algorithm-06.html:32 thousand = 3, hundred = 4, ten = 2 , single = 5 "MMMCDXXV" convertToRoman(3999) algorithm-06.html:32 thousand = 3, hundred = 9, ten = 9 , single = 9 "MMMCMXCIX" convertToRoman(4000) algorithm-06.html:21 4000 is not between 1000 and 3999, please check your number ! undefined convertToRoman(3440) algorithm-06.html:32 thousand = 3, hundred = 4, ten = 4 , single = 0 "MMMCDXL" convertToRoman(1) algorithm-06.html:32 thousand = 0, hundred = 0, ten = 0 , single = 1 "I" convertToRoman(10) algorithm-06.html:32 thousand = 0, hundred = 0, ten = 1 , single = 0 "X" convertToRoman(239) algorithm-06.html:32 thousand = 0, hundred = 2, ten = 3 , single = 9 "CCXXXIX"
findAllRightEleFromObjArray 从对象数组中找出包含目标对象中所有键值对的对象元素,组成新数组返回
通过使用数组方法:map()遍历数组,和对象构造器方法:Object.keys()去获取对象中所有键组成的数组map: 通过遍历数组每个元素,并且绑定一个处理函数,最终的返回值是一个数组类型,包含了对每个值的处理结果
Object.keys:返回对象中所有的键字符串形式组成新的数组
function findAllRightEleFromObjArray(collection, source) { var rightObjArr = [], has = true; // get all keys of source var srcKeys = Object.keys(source); collection.map(function (obj, index) { srcKeys.map(function(keyV){ if ( obj.hasOwnProperty(keyV) ) { // has // 判断值是否相同,如果不同记录为false if ( obj[keyV] != source[keyV] ) has = false; } else { // 到这里,表示该属性不存在 has = false; } }); // 只要has为false,表示至少有一个source中的键值对不被包含在collection的对象中 // 则不符合条件,不添加到最后的符合要求的结果中 if ( has ) rightObjArr.push(obj); // 重置判断标识 has = true; }); // 返回符合条件的对象数组 return rightObjArr; };
translatePigLatinString: 拉丁猪字符串转换
分析可能的两种情况(主要使用到的方法:split, findIndex, splice, join)如果字符串第一个字符是元音字符,则直接在字符串最后面追加“way”返回;
如果字符串第一个字符是非元音字符,则找到字符串中第一个元音字符的位置,根据这个位置将其前面的所有非元音字符用splice删除,并将删除的字符(字符串),追加到字符串结尾,然后再追加”ay”,组成新的字符串返回;
function translatePigLatinString ( str ) { if ( !str ) return; // 如果字符串第一个字符就是元音字符,直接在后面追加"way" if ( tools.isVowel(str[0]) ) return str + "way"; var strArr = str.split(""), preStr = "", index = -1; /** * findIndex: 用来查找数组中符合callback条件的元素的索引 * find: 返回的是元素本身 */ index = strArr.findIndex(function ( ele, index ) { if ( tools.isVowel(ele) ) return index; }); // 取出最前面非元音字符的字符 preStr = strArr.splice( 0, index ).join( "" ); strArr.push( preStr ); return strArr.join( "" ) + "ay"; }
findVacantCharsFromString : 从一串连续且有序的字符串中找出空缺的字符,返回所有空缺字符组成的数组
思路:将字符串变成数组,用split;
用reduce去遍历该数组;
reduce中,用上一个元素转码 + 1 和下一个比较,相等表示挨着不保存,不相等表示中间空了字符,保存该字符(即上一个字符转码后+1);
把步骤3中找到的空缺字符保存到数组中,最后处理完,得到的数组就是字符串中空缺的字符组成的数组。
缺陷(有待完成):
尚不能找出中间空缺两个及两个字符以上的情况,如:”abcdgh”该字符’d’和’g’之间相差两个字符的情况没法找出来;
传进来的字符串不一定是有顺序的,需要进行排序处理。
/** * 4. 找出字符串中不连续的空缺字符 * 比如:"abce"中间漏掉了个"d"字符串 * @param {String} str 目标字符串 * @return {数组} 空缺字符组成的新数组,如果传入的字符串都是连续的则返回"undefined" * * PS:目前只支持中间空缺一个字符的情况(如:"abcf"中间空缺"de"两个的还不支持) */ function findVacantCharsFromString ( str ) { if ( !str ) return; // 1. 将字符串变成数组,用split // 2. 用reduce去遍历该数组 // 3. reduce中,用上一个元素转码 + 1 和下一个比较,相等表示挨着不保存 // 不相等表示中间空了字符,保存该字符(即上一个字符转码后+1) // 4. 把步骤3中找到的空缺字符保存到数组中,最后处理完, // 得到的数组就是字符串中空缺的字符组成的数组 var strArr = str.split(""), resArr = []; // 使用到的原生API // string.charCodeAt(index) : 将字符串中索引指定位置的字符转成ASC编码 // String.fromCharCode(num1[, num2 ...]) : 将ASC编码转成字符, // > 支持多个同时转,返回转成功之后字符组成的字符串; // // PS: 注意编码转字符的方法,是String的类方法 strArr.reduce(function ( preV, currV, currIndex, array ) { var preVCode = preV.charCodeAt(0), currVCode = currV.charCodeAt(0); if ( preVCode + 1 != currVCode ) { // 先从编码转成字符,保存到空缺字符数组中 resArr.push( String.fromCharCode( preVCode + 1 ) ); } // 因为reduce的返回值即下一个preV的值 // 所以这里将当前的值currV保存到preV return currV; }); return resArr.length > 0 ? resArr : "undefined"; }
有蛮久学习了,最近一直在调整作息,之前一直很晚在看书啊,写点代码什么的,但是发觉第二天状态非常不好,上班经常瞌睡走神,所以这段时间把作息调整了过来^_^!!! 现在啊,回去浪一下,翻翻书十一点也就睡了,可是为啥早上还是那么贪睡 - -!!! 不过上班精神多了,写起代码来,解起问题来效率也大大提高不少。也决定把晚上时间多休息休息,周末好好学习。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 设计模式---状态模式在web前端中的应用
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子