JS编程题整理

目录

1. 生成随机字符串

/**
 * 说明:生成一个指定长度(默认6位)的随机字符,随机字符包含小写字母和数字。
 * 输入:输入随机字符长度,无输入默认6位
 * 输出:随机字符,如"6bij0v"
*/

方式一:

function idGenerator() {
    /* 功能实现 */
    var str = "abcdefghijklmnopqrstuvwxyz0123456789";
    var res = "";
    var len = arguments[0] ? arguments[0]:6;
    var strlen = str.length;
  	for(let i=0;i<len;i++){
        res += str.charAt(Math.floor(Math.random()*strlen));
    }
  	return res;
}

console.log(idGenerator());  // 0gtc7j
console.log(idGenerator(8)); // nfm9p1zb

方式二:

function idGenerator() {
    var len = arguments[0] ? arguments[0]:6;
    return Math.random().toString(36).slice(-len);  // 生成随机数->转换为36进制->截取后len位
}

console.log(Math.random())
console.log(idGenerator());  // ybdhfk
console.log(idGenerator(8)); // t03acf5g

由于随机数的不确定性,可能生成的比较短,就会产生问题;
方式三:

function idGenerator() {
    var len = arguments[0] ? arguments[0]:6;
    var res = "";
    for(let i=0;i<len;i++){
        res +=  Math.random().toString(36).slice(-1);
    }
    return res;
}
console.log(idGenerator());  // 7qp3wg
console.log(idGenerator(8)); // r4ajk5hw

2. 判断回文

/**
 * 回文,给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

输入: "A man, a plan, a canal: Panama"
输出: true

输入: "race a car"
输出: false
**/

方式一:

function isPalindrome(s) {
    /* 功能实现 */
    var arr = s.split("");
    var reg = /^[0-9a-zA-Z]+$/
  	var res = arr.filter(item =>{
    	return reg.test(item)  // 正则过滤出字母和数字
    })
    var res = res.map(item => {
    	return item.toUpperCase();  // 转为大写字母
    })
  	var l = 0;
  	var r=res.length-1;
  	while(l!=r && l<r){
    	if(res[l]!=res[r]){
        	return false
        }
        l++;
        r--;
    }
  	return true;
}
console.log(isPalindrome("A man, a plan, a canal: Panama")) // true
console.log(isPalindrome("race a car"))  // false

3. 实现简单queryString

/**
 * 简单实现一个queryString,具有parse和stringify的能力,
 * parse,用于把一个URL查询字符串解析成一个键值对的集合。
 * 输入:查询字符串 'foo=bar&abc=xyz&abc=123'
 * 输出:一个键值对的对象
 * {
 *   foo: 'bar',
 *   abc: ['xyz', '123'],
 * }
 * stringify,相反的,用于序列化给定对象的自身属性,生成URL查询字符串。
 * 输入:一个键值对的对象
 * {
 *   foo: 'bar',
 *   abc: ['xyz', '123'],
 * }
 * 输出:查询字符串 'foo=bar&abc=xyz&abc=123'
 */

方式一:

const queryString = {
    parse() {
        /* 功能实现 */
        let arg = arguments[0];
        let obj = {}
        let arr = arg.split("&")
        arr = arr.map(item => {
            return item.split("=");
        })
        for(let i=0,len=arr.length;i<len;i++){
            let item = arr[i][0];
            if(obj[item]){
                obj[item] = [obj[item]].concat([arr[i][1]])
            }else{
                obj[arr[i][0]]=arr[i][1]
            }
        }
        return obj;
    },
    stringify() {
        /* 功能实现 */
        let obj = arguments[0]
        let str = ""
        var arr = []
        for(let item in obj){
            if(Array.isArray(obj[item])){
                let m= obj[item].map(i=>{
                    return item+"="+i
                })
                arr = arr.concat(m)    
            }else{
                arr.push(item+"="+obj[item])
            }
        }
        str += arr.join("&")
        return str
    },
};

console.log(queryString.parse('foo=bar&abc=xyz&abc=123')); // { foo: 'bar', abc: [ 'xyz', '123' ] }
var res = {
    foo: 'bar',
    abc: ['xyz', '123'],
}
console.log(queryString.stringify(res))  // foo=bar&abc=xyz&abc=123

4. 数组扁平化去重并升序

方式一:

var arr = [13,2,[3,61,[3,[1,2]]],6];
var arr1 =Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{
  return a-b;
})
console.log(arr1) // [1, 2, 3, 6, 13, 61]

方式二:

var arr = [13,2,[3,61,[3,[1,2]]],6];
function flat(arr){   // 自己编写flat函数,全部扁平化
    while(arr.some(item => Array.isArray(item))){
        arr = [].concat(...arr)
    }
    return arr;
}
var arr1 = Array.from(new Set(flat(arr))).sort((a,b)=>a-b);
console.log(arr1) // [ 1, 2, 3, 6, 13, 61 ]

5. JS全排列

输入:3
输出:[123, 132, 213, 231, 312, 321]
function f(num){ 
  var str = "";
  for(let i=1;i<=num;i++){
    str+=i;
  }
  return f1(str).map(item => parseInt(item)) // 数组里的字符元素转换为数值元素
}

function f1(str){
  var res = [];
  if(str.length>1){
    for(let j=0,len=str.length;j<len;j++){
      var left = str[j];
      var rest = str.slice(0,j)+str.slice(j+1,str.length);
      var preF = f1(rest);
      for(let m=0,preL=preF.length;m<preL;m++){
        var tmp = left+preF[m];
        res.push(tmp)
      }
    }
  }else if (str.length==1){
    res.push(str);
  }
  return res;
}
console.log(f(3)) // [123, 132, 213, 231, 312, 321]

6. 节流和防抖

// 防抖
function debounce (func,time){
    let timer = null;
    return () => {
        clearTimeout(timer);
        timer = setTimeout(()=>{
            func.apply(this,arguments);
        },time)
    }
}

// 节流
function throtte(func,time){
    let activeTime;
    return ()=>{
        let current = Date.now();
        if(activeTime === undefined || current-activeTime > time){
            func.apply(this,arguments);
            activeTime = Date.now();
        }
    }
}

7. 隐式类型转换

// 下面代码在什么情况下会打印1?
var a = ?;
if(a==1 && a==2 && a==3){
	console.log(1);
}

引用类型在比较运算符的时候,隐式转换会调用toStringvalueOf方法:

var a = {
  i:1,
  toString(){
    return a.i++
  }
}
if(a==1 && a==2 && a==3){
    console.log(1);
}
var a = {
  i:1,
  valueOf(){
    return a.i++;
  }
}
if(a==1 && a==2 && a==3){
    console.log(1);
}
var a = [1,2,3];
a.join=a.shift;
if(a==1 && a==2 && a==3){
    console.log(1);
}

对象的Symbol.toPrimitive属性。指向一个方法。该对象被转化为原始类型的值时,会调用这个办法,返回该对象对应的原始类型值。

var a = {[Symbol.toPrimitive]:((i)=>()=>++i)(0)};
if(a==1 && a==2 && a==3){
    console.log(1);
}

8. 合并数组并排序

题目:请把两个数组['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 a = ['A1','A2','B1','B2','C1','C2','D1','D2'];
let b = ['A','B','C','D'];
b = b.map((item)=>{
  return item+3;
})
let c = [...a,...b].sort().map((item)=>{
  if(item.includes('3')){
    return item.split('')[0]
  }
  return item;
})
console.log(c)

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章