Javascript算法练习(四)
将数组分割成等长数组,然后组合成一个二维数组返回
循环 + slice + push
- 函数名:function chunkArrayInGroups(arr, size);
- arr: 需要被分割的数组,size:指定等分数组的长;
- 情况分析:这个方法的实现主要考虑两个方面
- 数组长被size整除,即刚好能分成n个等分数组;
- 不能整除,即最后一个数组的长度是数组长与size取余数的结果。
function chunkArrayInGroups(arr, size) {
if ( !arr || size <= 0 ) return "Invalid Arguments !";
var iLen = arr.length,
iDiv = 0,
iMod = 0,
aTmp = [],
oLst = null;
// 在数组长小于传入的size时,直接返回原数组就行
if ( iLen <= size ) return arr;
iDiv = Math.floor(iLen / size); // 取出相除后的结果向下取整
// 取余数,用于判断是否存在需要单独处理的最后一个不够size长的数组
iMod = iLen % size;
// 不能被size整除,表示最后一个数组里包含< size个元素,需要单独处理
if ( iMod !== 0 ) {
oLst = arr.slice( (-1) * iMod);
}
for (var i = 0; i < iDiv; i++) {
aTmp.push( arr.slice( i * size, i * size + size ) );
}
if ( oLst ) aTmp.push(oLst);
return aTmp;
}
var f = chunkArrayInGroups;
console.log( f([1, 2, 3, 4], 2) ); // [[1,2], [3, 4]]
console.log( f([1, 2, 3, 4, 5], 3) ); // [[1, 2], [3, 4], [5]]
console.log( f([1, 2, 3, 4, 5], 6) ); // [1, 2, 3, 4, 5]
console.log( f([1, 2, 3, 4, 5], -1) ); // Invalid Arguments !
两个字符串中的字符是否包含(即:str1中的所有字符是否都能在str2中找到,忽略顺序和大小写)
function mutation ( arr ) {
if ( !arr || arr.length < 2 ) return "Invalid argument !";
var iArgLen = arguments.length,
eFirst = arr[0].toString().toLowerCase(),
eSec = arr[1].toString().toLowerCase(),
sTmp = "";
if ( eFirst.length < eSec.length ) {
sTmp = eFirst;
eFirst = eSec;
eSec = sTmp;
}
for ( var i = 0; i < eSec.length; i++ ) {
if ( eFirst.indexOf(eSec[i]) < 0 ) return false;
}
return true;
}
console.log( mutation(["hello", "HLOOOOEO"]) );
console.log( mutation(["hello", "HLElO"]) );
console.log( mutation(["hello", "HLE"]) );
从数组中过滤掉指定的元素
- 原型:function filterEleFromArray(arr[, item1[, item2[, … itemn]]];
function filterEleFromArray(arr) {
var args = arguments,
aTmp = [];
for (var i = 1; i < args.length; i++ ) {
aTmp.push(args[i]);
}
return arr.filter(function(value){
return aTmp.indexOf(value) < 0;
});
}
console.log(filterEleFromArray([1, 2, 3, 5, 1, 2, 3], 2, 3));
console.log(filterEleFromArray([1, 2, 3, 1, 2, 3], 2, 3));
console.log(filterEleFromArray([3, 5, 1, 2, 2], 2, 3, 5));
console.log(filterEleFromArray([2, 3, 2, 3], 2, 3));
console.log(filterEleFromArray(["aaa", "bbb", 3, "ddddd"], "aaa", 3));
algorithm-04.htm:26 [1, 5, 1]
algorithm-04.htm:27 [1, 1]
algorithm-04.htm:28 [1]
algorithm-04.htm:29 []
algorithm-04.htm:30 ["bbb", "ddddd"]
字符串加密处理
- 这里使用的是最简单的方式,对每个字符串进行转码之后加上或减掉固定的数值,然后再转回字符组成字符串
- 主要学习:
- str.charCodeAt(index); 返回字符串中指定索引index的字符的10进制编码
- String.fromCharCode(a1, a2, …); 将整数参数(可多个参数,非整数会被当做0处理)逐个转成字符之后再组合成字符串返回,此方法为String的静态方法,所以只能用String去调用。
function stringEncoding( __str ) {
if ( !__str ) return;
return __str.toUpperCase().split("").map(function( elem, index ) {
var code = elem.toString().charCodeAt(0);
if ( code >= 65 && code <= 90 ) {
var iStep = index % 2 ? 10 : 13;
return String.fromCharCode( code + iStep > 90 ? code + iStep - 90 + 65 : code + iStep);
} else {
return elem;
}
}).join("");
}
console.log("result = " + stringEncoding("Hello!!!!"));
console.log("result = " + stringEncoding("Hello!!!!"));