牛客网-js经典题

146 阅读2分钟

1. 查找数组元素位置

function indexOf(arr, item) {
    return arr.indexOf(item);
}

2. 数组求和

function sum(arr) {
    let res = 0;
    for(let i = 0; i < arr.length; i ++){
        res += arr[i];
    }
    return res;
}

forEach

function sum(arr) {
    let res = 0;
    arr.forEach((value, index, array) => {
        res += value;
    })
    return res;
}

reduce

function sum(arr) {
    return arr.reduce((pre,cur) =>{
        return pre + cur;
    })
}

3. 移除数组中的元素 返回新数组

filter

function remove(arr, item) {
    return arr.filter((res) => {
        return res != item;
    })
}

for+push

function remove(arr, item) {
    let res = [];
    arr.forEach((value, index) => {
        if(value != item) {
            res.push(value);
        }
    })
    return res;
}

4. 移除数组中的元素 修改原数组

splice

function removeWithoutCopy(arr, item) {
    for(let i = 0; i < arr.length; i ++) {
        if(arr[i] === item){
            arr.splice(i,1);
            i --;
        }
    }
    return arr;
}

原数组减少一个元素后,i--

5. 添加元素 返回新数组

concat

function append(arr, item) {
    return arr.concat(item);
}

...扩展

function append(arr, item) {
    return [...arr, item];
}

for \ slice浅拷贝 + push

6 删除数组最后一个元素

返回一个新数组

function truncate(arr) {
    let newarr = arr.slice(0)
    newarr.pop()
    return newarr
}

7 添加元素

function prepend(arr, item) {
    let newarr = arr.slice(0);
    newarr.unshift(item);
    return newarr;
}

8 删除数组第一个元素

function curtail(arr) {
    let newarr = arr.slice(0);
    newarr.shift();
    return newarr;
}

9 数组合并

function concat(arr1, arr2) {
    let newarr = arr1.concat(arr2);
    return newarr;
}
function concat(arr1, arr2) {
    let newarr = [...arr1, ...arr2];
    return newarr;
}

10 添加元素(指定位置添加)

function insert(arr, item, index) {
    let newarr = arr.slice(0);
    newarr.splice(index, 0, item);
    return newarr;
}

11 计数

function count(arr, item) {
    let num = 0;
    arr.forEach(val => {
        if(val === item) num ++;
    })
    return num;
}

12 查找重复元素

function duplicates(arr) {
    let res = [];
    arr.forEach( v => {
        if(arr.indexOf(v) !== arr.lastIndexOf(v) && res.indexOf(v) === -1){
            res.push(v);
        }
    })
    return res;
}

13 求二次方

function square(arr) {
    let res = arr.map((value, index, array) => {
        return value * value;
    });
    return res;
}

14 查找元素位置

function findAllOccurrences(arr, target) {
    let res = [];
    arr.forEach((value, index) => {
        if(value === target) {
            res.push(index);
        }
    });
    return res;
}

15 避免全局变量

function globals() {
    // 加上 let
    let myObject = {
      name : 'Jory'
    };

    return myObject;
}

16 正确的函数定义

function functions(flag) {
    if (flag) {
      var getValue = function() { return 'a'; }
    } else {
      var getValue = function() { return 'b'; }
    }

    return getValue();
}

17 正确使用parseInt

function parse2Int(num) {
    return parseInt(num, 10);
}

18 完全相等

function identity(val1, val2) {
    return val1 === val2;
}

19 计时器

function count(start, end) {
    console.log(start++);
    var timer = setInterval(
        function(){
            if(start <= end) {
                console.log(start++);
            }else{
                clearInterval(timer);
            }
        }, 100);
    
    return {
        cancel: function(){
            clearInterval(timer);
        }
    }
}

20 流程控制

function fizzBuzz(num) {
    if(num % 3 === 0 && num % 5 === 0) {
        return 'fizzbuzz';
    }else if(num % 3 === 0) {
        return 'fizz';
    }else if(num % 5 === 0) {
        return 'buzz';
    }else if(num === null || typeof num !== 'number'){
        return false;
    }else{
        return num;
    }
    
}

21 函数传参

function argsAsArray(fn, arr) {
    return fn.apply(this, arr);
}

22 函数的上下文

//apply
function speak(fn, obj) {
    return fn.apply(obj);
}
//call
function speak(fn, obj) {
    return fn.call(obj);
}
//bind
function speak(fn, obj) {
    return fn.bind(obj)();
}

23 返回函数

function functionFunction(str) {
    return f = function(str2) {
        return str + ', ' + str2;
    }
}

24 使用闭包

function makeClosures(arr, fn) {
    let result = [];
    // forEach 和 let可以规避
    arr.forEach((index,value) => {
        result.push(() => {
            return fn(index);
        })
    })
    return result;
}

立即执行函数

function makeClosures(arr, fn) {
    var result = [];
    // forEach 和 let可以规避
    for(var i = 0; i < arr.length; i ++) {
        (function (i) {
            result[i] = function() {
                return fn(arr[i])
            }
        })(i);
    }
    return result;
}

25 二次封装函数

function partial(fn, str1, str2) {
    return function(str3) {
        return fn(str1, str2, str3);
    }
}

26 使用 arguments

function useArguments() {
    let arr = Array.prototype.slice.call(arguments); //转化为数组
    let res = 0;
    arr.forEach((value) => {
        res += value;
    })
    return res;
}

27 使用 apply 调用函数

function callIt(fn) {
    return fn.apply(this, [].slice.call(arguments, 1))
}

28 二次封装函数

function partialUsingArguments(fn) {
    let args = [].slice.call(arguments, 1);
    return reslut = function() {
        return fn.apply(this, args.concat([].slice.call(arguments)));
    }   
}

29 柯里化 难

function curryIt(fn) {
    let args = [];
    let result = function(arg) {
        args.push(arg);
        if(args.length < fn.length) {
            return result;
        }else{
            return fn.apply(this, args);
        }
    }
    return result;
}

30 或运算

function or(a, b) {
    return (a || b);
}

31 且运算

function and(a, b) {
    return (a && b);
}

32 模块

function createModule(str1, str2) {
    let obj = {
        greeting: str1,
        name: str2,
        sayIt: function(){
            return obj.greeting + ', ' + obj.name;
        }
    }
    return obj;
}

33 二进制转换

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

34 二进制转换

function base10(str) {
    return parseInt(str, 2);
}

35 二进制转换

function convertToBinary(num) {
    let res = num.toString(2);
    while(res.length < 8) {
        res = '0' + res;
    }
    return res;
}

36 乘法

function multiply(a, b) {
    let str1 = a.toString();
    let str2 = b.toString();
    let lenA = (str1.indexOf('.') === -1) ? 0: (str1.length - 1 - str1.indexOf('.'))
    let lenB = (str2.indexOf('.') === -1) ? 0: (str2.length - 1 - str2.indexOf('.'))

                                                                                   
    let len = Math.max(lenA, lenB);
    let result = parseFloat(a * b).toFixed(len);
    return result;
    
}

37 改变上下文

function alterContext(fn, obj) {
    return fn.apply(obj);
}

38 批量改变对象的属性

function alterObjects(constructor, greeting) {
    constructor.prototype.greeting = greeting;
}

39 属性遍历

function iterate(obj) {
    let result = [];
    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            result.push(key+": "+obj[key]);
        }
    }
    return result;
}

40 判断是否包含数字

function containsNumber(str) {
    return /\d./.test(str);
}

41 检查重复字符串

function containsRepeatingLetter(str) {
    return /([a-zA-Z])\1/.test(str);
}

42 判断是否以元音字母结尾

function endsWithVowel(str) {
    return /[a,e,i,o,u]$/i.test(str);
}

43 获取指定字符串

function captureThreeNumbers(str) {
    let arr = str.match(/\d{3}/);
    if(arr){
        return arr[0];
    }else{
        return false;
    }
}

44 判断是否符合指定格式

function matchesPattern(str) {
    return /^\d{3}-\d{3}-\d{4}$/.test(str);
}

45 判断是否符合 USD 格式

function isUSD(str) {
    return /^\$\d{1,3}(,\d{3})*(\.\d{2})?$/.test(str);
}