那些称为妙手的 前端编程题,只有你想不到,没有做不到的方法!!!

91 阅读4分钟

谁说我们前端只有单线程的思考,进来考考你还要其他方法嘛?编程题附加答案,你有更妙的想法,欢迎留言噢😊😊

1、请把两个数组 ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] 和 ['A', 'B', 'C', 'D'],合并为 ['A1', 'A2', 'A', 'B1', 'B2', 'B', 'C1', 'C2', 'C', 'D1', 'D2', 'D']。

let a1 = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2'] let a2 = ['A', 'B', 'C', 'D'].map((item) => { return item + 3 }) let a3 = [...a1, ...a2].sort().map((item) => { if(item.includes('3')){ return item.split('')[0] } return item })

2、改造下面的代码,使之输出0 - 9,写出你能想到的所有解法。

for (var i = 0; i < 10; i++) {

setTimeout(i => {

console.log(i);

}, 1000, i)

3、{1:222, 2:123, 5:888},请把数据处理为如下结构:[222, 123, null, null, 888, null, null, null, null, null, null, null]。

let obj = {1:222, 2:123, 5:888};

const result = Array.from({ length: 12 }).map((_, index) => obj[index + 1] || null);

console.log(result)

4、已知如下数组:

var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]; function flatAll(arr) { // toString方法将数组转化成字符串'1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10' // split(',')方法将字符串转换成数组["1", "2", "2", "3", "4", "5", "5", "6", "7", "8", "9", "11", "12", "12", "13", "14", "10"] // sort 方法排序 // map(Number) 方法将每个元素映射成数字 console.log(arr.toString().split(',')) var arr2 = arr.toString().split(',').sort((a, b) => a - b).map(Number) // set结构去重 // Array.from 方法通过类数组结构创建数组 return Array.from(new Set(arr2)); } console.log(flatAll(arr))

5、求两个数组的交集

let arr1 =[0,2,4,5,7]

let arr2 = [0,3,5,6,8,4,9,55]

var newarr = arr1 .filter((v) => arr2 .includes(v))

//也可以用,不考虑(数组中不含NaN)

newarr = arr1.filter((v)=> arr2.indexOf(v)>-1 )

//filter方法是返回一个符合过滤条件的新数组,不改变原有的数组

5-1、求并集

arr1.concat(arr2.filter(function(v) {

return arr1.indexOf(v) === -1})) // [1,2,3,4,5]

5-2、求差集

newarr= a.filter(function(v){

return b.indexOf(v) === -1

}).concat(b.filter(function(v){ return a.indexOf(v) === -1 }))

6、随机生成一个长度为10的数组,如[2, 10, 3, 4, 5, 11, 10, 11, 20],将其排列成形式如下的新数组: [[2, 3, 4, 5], [10, 11], [20]]。

function method2() {

const getRandomNum = () => Math.floor(Math.random() * 100) + 1;

const arr = Array.from({ length: 10 }).map(getRandomNum);

const newArr = [...new Set(arr)].sort((a, b) => a - b);

const obj = {};

newArr.forEach(item => {

let key = Math.floor(item / 10);

!obj[key] ? (obj[key] = [item]) : obj[key].push(item);

});

return [...Object.values(obj)];

}

// 得到一个两数之间的随机整数,包括两个数在内

function getRandomIntInclusive(min, max) {

min = Math.ceil(min);

max = Math.floor(max);

return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值

}

// 随机生成10个整数数组, 排序, 去重

let initArr = Array.from({ length: 10 }, (v) => { return getRandomIntInclusive(0, 99) });

initArr.sort((a,b) => { return a - b });

initArr = [...(new Set(initArr))];

// 放入hash表

let obj = {};

initArr.map((i) => {

const intNum = Math.floor(i/10);

if (!obj[intNum]) obj[intNum] = [];

obj[intNum].push(i);

})

// 输出结果

const resArr = [];

for(let i in obj) {

resArr.push(obj[i]);

}

console.log(resArr);

7、 如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC' 变成 'aBc' 。

let str = 'Hello世界和平World!' //str.replace(/[a-zA-Z]/g 通过正则表达式来捕获所有字母 content为捕获结果 str = str.replace(/[a-zA-Z]/g,function(content){ //方法一:content.toUpperCase()===content //方法二:content.charCodeAt()>=65 && content.charCodeAt()<=90 //此段代码逻辑:将捕获的结果转化为大写字母与捕获结果来进行判断,若为true表示捕获的结果为大写字母,需要转化为小写字母,否则转为大写字母 return content.toUpperCase()===content?content.toLowerCase():content.toUpperCase() }); console.log(str)

8、给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

function rotate(arr, k) {

const len = arr.length

const step = k % len

return arr.slice(-step).concat(arr.slice(0, len - step))

}

// rotate([1, 2, 3, 4, 5, 6], 7) => [6, 1, 2, 3, 4, 5]

9、打印出 1 - 10000 之间的所有对称数

function isSameNum(start, end) {

start = (start <= 11 ? 11 : start);

for (var i = start; i <= end; i++) {

var strI = +(i. toString().split('').reverse(). join(''));

if (strI == i) {

console.1og(i);

}

}

}

10、给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

// 示例:

// 输入: [0,1,0,3,12]

// 输出: [1,3,12,0,0]

  1. 必须在原数组上操作,不能拷贝额外的数组。

  2. 尽量减少操作次数。

//直接交换

var moveZeroes = function (nums) {

if (nums.length < 2) {

return nums

}

let tmp = 0 //tmp指向0存在的位置

for (let i = 0; i < nums.length; i++) {

if (nums[i] != 0) {

if (nums[tmp] == 0) {

nums[tmp] = nums[i]

nums[i] = 0

}

tmp++

}

}

return nums

};