一些常规面试题

 1. 算法基础:数组 flat 、去重及排序

let arr = [

            [

                [

                    '1-7',

                    '2-6',

                    '4-5',

                ],

                '4-6',

                [

                    ['2-0', '1-4'],

                    ['3-9'],

                    '4-5',

                ],

            ]

        ];

        // Q1: 完成数组 flat 函数

        // 1) 不指定dep 默认Infinity

 function flat(arr) {

            let newArr = [];

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

                if (Array.isArray(arr[i])) {

                    newArr = newArr.concat(flat(arr[i]));

                } else {

                    newArr = newArr.concat(arr[i]);

                }

            }



            arr = newArr;

            return arr;

        }

 

        // 2)  指定dep  参考 (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat       

 function _flat(flatArray, dep=1){

            if(Number.isNaN(Number(dep))||Number(dep)<1) return flatArray;

            var curDep = 1;

            function recursionFun(flatArray, dep, curDep){

                return flatArray.reduce((acc,val) => (

                    Array.isArray(val)&&(dep === Infinity || curDep< dep)

                    ? acc.concat(recursionFun(val, dep, curDep + 1))

                    : acc.concat(val)

                ), []);

            }

            return recursionFun(flatArray, dep, curDep);

        }



        arr = _flat(arr, Infinity);

        console.log(arr);

 

        // Q2: 计算 arr 中所有的值:'1-7' => 1 * 7 = 7 返回一个数字组成的数组


        function calc(arr) {



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

                if (arr[i].indexOf('-') > -1) {

                    arr[i] = eval(arr[i].replace('-', '*'));

                }

            }

            return arr;

        }



        arr = calc(arr);

        console.log(arr);

        // Q3: 对这个数组排序和去重       

function sortAndReduce(arr) {

            // code



            // 去重

            arr = Array.from(new Set(arr));



            // 排序

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



                for (let j = i + 1; j < arr.length; j++) {

                    if (arr[i] < arr[j]) {

                        [arr[i], arr[j]] = [arr[j], arr[i]]

                    }

                }

            }



            return arr;

        }



        arr = sortAndReduce(arr);

        console.log(arr);

2. 值和引用(参考自《你不知道的JavaScript(中卷)》第二章 值)

function foo(x) {
    x.push( 4 );
    x; // [1,2,3,4]

    x = [4,5,6];
    x.push( 7 );
    x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // [1,2,3,4]

我们向函数传递 a 的时候,实际是将引用 a 的一个复本赋值给 x ,而 a 仍然指向 [1,2,3] 。在函数中我们可以通过引用 x来更改数组的值(push(4) 之后变为 [1,2,3,4] )。但 x = [4,5,6] 并不影响 a 的指向,所以 a 仍然指向[1,2,3,4] 。

 

接下来再看一个栗子:

function foo(x) {
    x.push( 4 );
    x; // [1,2,3,4]

    x.length = 0; // 清空数组
    x.push( 4, 5, 6, 7 );
    x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // [4,5,6,7],

从上例可以看出,x.length = 0 和 x.push(4,5,6,7) 并没有创建一个新的数组,而是更改了当前的数组。于是 a 指向的值变成了 [4,5,6,7] 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值