关于数组的练习题
1、不使用for循环,实现一个方法,传入m n两个参数,返回一个长度为m,每项为n的数组
(1)递归,使用递归也特别注意return的使用。
function func(m, n) {
if(typeof m !== "number" && m <= 0){
return arr;
}else {
arr[arr.length] = n;
return arguments.callee(m-1, n);
}
}
console.log(func(8, 5)); [5, 5, 5, 5, 5, 5, 5, 5]
(2)类数组转数组后,调用map方法。Array.from得到是长度为m值为undefined的数组。不是空数组。
function func(m, n) {
var arrObj = {
length: m
}
return Array.from(arrObj).map(() => n);
}
console.log(func(8, 5));
其实Array.from,第二个参数是一个处理函数,跟map的效果一样:
function func(m, n) {
var arrObj = {
length: m
}
return Array.from(arrObj, () => n);
}
console.log(func(8, 5)); [5, 5, 5, 5, 5, 5, 5, 5]
以下方式得到的还是空数组。调用map方法无效。
function func(m, n) {
var arr = [];
arr.length = m;
return arr.map(() => n);
}
2、编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
var result = [];
arr.toString().split(",").sort((a,b)=>a-b).map((item,index)=>{
//split的拆分使得数组的每项都是字符串类型
result.indexOf(item) == -1 ? result.push(Number(item)) : "";
});
console.log(result); [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14]
数组的toSting会去处理数组每项及其子项,得到字符串:1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10。toSting就是拆除所有的中括号
split按逗号查分字符串:["1", "2", "2", "3", "4", "5", "5", "6", "7", "8", "9", "11", "12", "12", "13", "14", "10"]。使得每项都成了字符串类型。
3、请把两个数组 ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] 和 ['A', 'B', 'C', 'D'],合并为 ['A1', 'A2', 'A', 'B1', 'B2', 'B', 'C1', 'C2', 'C', 'D1', 'D2', 'D']。
var arr1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'];
var arr2 = ['A', 'B', 'C', 'D'];
arr2.map((item, index) => {
arr1.splice((index+1)*2 + index,0,item);
})
console.log(arr1); ["A1", "A2", "A", "B1", "B2", "B", "C1", "C2", "C", "D1", "D2", "D"]
4、反转二维数组
原数组:
let arr = [
['1', '2', '3'],
['a', 'b', 'c'],
]
(1)输出的结果:
let arr1 = [
["1", "a"],
["2", "b"],
["3", "c"]
]
代码:二维数组创建了i个数组
//arr二维数组 flag
function transformArr(arr, flag) {
let transformResult = [];
if (flag) {
arr.reverse();
}
arr.forEach((arrItem, index) => {
arrItem.forEach((item, i) => {
if (!Array.isArray(transformResult[i])) {
transformResult[i] = [];
}
transformResult[i][index] = item;
})
})
return transformResult;
}
let result = transformArr(arr, false);
(2)如果输出结果:输出了8个数组
[
[ 'a', 'b', 'c' ],
[ 'a', 'b', '3' ],
[ 'a', '2', 'c' ],
[ 'a', '2', '3' ],
[ '1', 'b', 'c' ],
[ '1', 'b', '3' ],
[ '1', '2', 'c' ],
[ '1', '2', '3' ]
]
代码:
function transformArr(arr){
let row = arr.length;
let column = arr[0].length;
let nums = row ** column; //生成新数组的行数
let newArrColumnNum = []; //每列字符连续出现的次数
let resultArr = [];
for(let i = 0; i < column; i++){
newArrColumnNum[i] = row ** (column-i-1)
}
for(let l = 0; l < column; l++){//新数组的列循环
for(let r = 0; r < nums; r++){//新数组的行循环
if(!Array.isArray(resultArr[r])){
resultArr[r] = [];
}
let index = Math.floor(r / newArrColumnNum[l]) % row; // 第二轮的时候,商是2,必须取原数组行数的余数
resultArr[r][l] = arr[index][l];
}
}
return resultArr;
}