牛客JS能力测试题记录

86 阅读3分钟

1.移除数组内输入的值(不修改原数组)

function remove(arr, item) {
     var arr2 = arr.filter(function(item2){ //filer过滤是不改变原数组的
        return item2 != item //item2就是arr中的各个元素,如果arr中包含对象,可以用item2.key来进行过滤
     })
        return arr2 //根据题目要求,必须要把移除值的数组返回回来!!
}

2.移除数组中的元素(修改原数组)

function removeWithoutCopy(arr, item) {
        while (arr.indexOf(item) !== -1) { 
            arr.splice(arr.indexOf(item), 1);
        }
        return arr;
    }
//下面这个能理解,上面的那个没懂
function removeWithoutCopy(arr,item) {
    for (var i = arr.length-1;i >= 0;i--) { //逆向检索
        if (arr[i] === item) { //如果和item相等就把它截掉
            arr.splice(i,1)
        }
    }
return arr
}

3.在数组末尾添加元素(不修改原数组)

//第一种思路:使用.push()在末尾添加元素
  //方法1:concat连接,不会改变原数组
  function append(arr, item) {
    var newArr = []
    newArr.push(item)
    return arr.concat(newArr)
    return arr.concat(item);
  }
  //方法2:map()遍历+push()
  function append(arr, item) {
    let arrNew = arr.map(function (item2) {
        return item2
    })
    arrNew.push(item)
    return arrNew
  }
//第二种天才思路:直接面向结果编程,使用...展开复制原数组
function append(arr, item) {
    return [...arr, item]
}

——>返回原数组的方法

//第一种:展开符号
let newArr = [...arr]
//第二种:concat
let newArr = arr.concat()
//第三种:slice
let newArr = arr.slice(0);
//第四种:map(应该没问题,但是不知道为什么题目不算对)
let arrNew = arr.map(item=>item)

4.使用apply调用函数

function callIt(fn) {
   let r = [ ... arguments]; //复制
   let s = r.slice(1);
   return fn.apply(null,s);
}

5.二进制转换(1)

function valueAtBit(num, bit) {
    let Num2Str = num.toString(2)
    return Num2Str[Num2Str.length - bit]
}

.toString(2)方法可以将"."前的对象转为二进制0和1(可以是赋值了数字的变量,或者是直接用小括号把要转换的括起来)

.toString(2)转换完之后是伪数组,所以可以通过下标进行访问,根据简单推理可以发现规律是长度-bit值

6.二进制转换(2)

function convertToBinary(num) {
    // 使用toString(),split(),unshift(),join()
    // 若二进制不足8if (num < 256) {
        // 使用toString(2)转换成二进制字符串,
        // 然后用split("")分割成字符串数组
        let binaryStrArr = num.toString(2).split("");
        // 字符串数组长度小于8时给前面unshift ‘0while (binaryStrArr.length < 8) {
            binaryStrArr.unshift('0');
        }
        // 返回字符串数组连接成的字符串
        return binaryStrArr.join("");
    }
    // 否则
    return num.toString(2);
}

这给我们一个启发:如何在数字、字符的某处添加数字/字符?

就是通过用.toString()转换为伪数组,然后用.split()拆分数组,

最后用数组增添或删除数据的方法达到目的(别忘了还要用.join("")进行连接!)

7.属性遍历

function iterate(obj) {
    const temp = []
    for(let key in obj){
        if(obj.hasOwnProperty(key)){ //使用.hasOwnProperty(key)来判断key是否在实例对象中
            temp.push(key.concat(': ',obj[key]))
        }
    }
    return temp
}

8.检查重复字符串

function containsRepeatingLetter(str) {
    let strArr = str.split("");
    let regex = /[a-z]/i; //判断是否符合a-z A-Z的正则表达式 i不区分大小写
    for(let i = 0; i < strArr.length; i++) {
        if (strArr[i] === strArr[i+1] && regex.test(strArr[i])) { 
        //因为必须时连续相同,所以用strArr[i] === strArr[i+1]来进行判断
            return true;
        }
    }
    return false;
}

9.闭包应用(1)

function makeClosures(arr, fn) {
    let result = [];
    for (let i = 0; i < arr.length; i++) {
        result[i] = fn.bind(this, arr[i]); 
    }
    return result;
}