2019-08-26JavaScript数组方法总结

2019-08-26  本文已影响0人  啊_6424

昨天参加了字节跳动的笔试,总共4道编程题。哎!一言难尽,算法渣渣,4道编程题全军覆没。
经过反思总结,我觉得自己的算法已经到了无药可救的地步,继续下去只是浪费时间。遂放弃算法那一块知识,专攻前端基础,就算算法不行,我希望我能用掌握好基础知识,感动面试官们!继续学习算法,我怕我到时候算法没学好,基础也没打牢固,面试官左右都不满意!

一、 将数组转为字符串

涉及到的方法有 toString(),join([parameter])

(一) toString()

toString()方法,所有的对象都有这个方法。

    var arr = [1,3,"45", {id: "23"}, null, undefined, true,[1,2,3]];
    console.log(arr.toString());
    console.log(arr);
image.png

JS中各种数据类型调用toString():

image.png

(二)join()

join([param1])

二、数组的基本操作

主要指增删查改

(一)通过索引号

实现增删查改所有操作

(二)push(),pop()

实现 类似于栈的 出栈,入栈 操作
数组的尾部进行 添加 或者 删除 操作。

push([param1], [param2],......,[param n])

在数组尾部添加多个元素(0……n)

pop()

删除最后一个元素

例子:
    var arr = [1,3,4];
    console.log(arr.pop());
    console.log("arr", arr);
    console.log(arr.push(2,5,0));
    console.log("arr", arr);
image.png

(三)shift(),unshift()

实现类似于队列的入队,出队操作
数组的头部进行 删除 或者 添加 操作

unshift([param1], [param2],......,[param n])

在数组头部添加多个新元素(0……n),并“反向位移”旧元素

shift()

删除数组的第一个元素,并“位移”其他元素

例子
    var arr = [1,3,4];
    console.log("arr", arr);
    console.log(arr.shift());
    console.log("arr", arr);
    console.log(arr.unshift(2,5,0));
    console.log("arr", arr);
image.png

(四)splice()

splice(index,count,[param1],[param2],……,[param n])

拼接数组,可能位移其他元素。
可实现数组的增删改

splice实现增删改

增:count = 0,定义要添加的新元素
splice(index, \color{red}{0 }, param1,param2,……,param n)
删:count > 0,不定义要添加的新元素
splice(index, \color{red}{ count }),删除count个元素
改:count > 0,定义要添加的新元素
splice(index, \color{red}{count, param1, param2,……, param n}

    var arr = [1,3,4,5,6,7];
    console.log("arr", arr);
    var deleteArr = [];
    arr.splice(2,0,"we","our"); // 从索引值 2 开始,删除0位元素,拼接新元素
    console.log("增", arr);
    arr.splice(0,2); // 从索引值 0 开始,删除两位元素
    console.log("删", arr);
    deleteArr = arr.splice(2,1,"edit");
    console.log("改", arr);
    console.log("删除的数据项", deleteArr);
image.png

(五)delete 运算符

任一索引处的元素,改为 undefined,会在数组留下未定义的空洞,不推荐使用
不涉及位移

三、数组的其他操作

主要指 合并,裁剪 等操作。

(一)concat()

concat(param1, param2, ……, paramn)

合并(连接)数组,区别于 拼接

    var arr = [1,3,4,5,6,7];
    var arr2 = [8,9,10,11];
    var concatArr = arr.concat(arr2);
    console.log("arr", arr);
    console.log("arr2", arr2);
    console.log("concatArr", concatArr);
如果需要arr2在前面,则arr2.concat(arr)就可以了

(二) slice()

slice( start,end ) : 裁剪数组
从start开始,直到end(不包括)为止

    var arr = [1,3,4,5,6,7];
    var sliceArr = arr.slice(2,10);
    console.log("arr", arr);
    console.log("sliceArr", sliceArr);
image.png

四、数组的排序类操作

主要指 排序,反转,查找最大,查找最小 等操作

(一)sort()

首先明确,排序指的是对 数字 或者是 字符 排序
sort([sortby])

比较函数:
该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。
比较函数应该具有两个参数 a 和 b,其返回值如下:
  1.若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  2. 若 a 等于 b,则返回 0。
  3.若 a 大于 b,则返回一个大于 0 的值。

数组排序
    var arr = [11,3,14,5,6,7];
    console.log("arr", arr);
    arr.sort();
    console.log("未规定按数值从小到大排序", arr);
    arr.sort(sortNumber);
    console.log("规定按数值从小到大排序", arr);
    function sortNumber(a, b){
        return a - b;
    }
正确的按数值排序了
对象数组排序

JavaScript 数组,经常会包含对象,对象拥有不同数据类型的属性,sort() 方法怎么对对象数组排序呢?——通过比较函数对比(数字,字符串)属性的属性值,从而排序

var cars = [
    {type:"Volvo", year:2016},
    {type:"Saab", year:2001},
    {type:"BMW", year:2010}
];
//比较数值属性
cars.sort(function(a, b){return a.year - b.year});
//比较字符串属性
cars.sort(function(a, b){
      var x = a.type.toLowerCase();
      var y = b.type.toLowerCase();
      if (x < y) {return -1;}
      if (x > y) {return 1;}
      return 0;
});

(二)reverse()

反转数组

(三) 查找最值

JavaScript 数组 没有 查找最高和最低值的 内建函数。

通过排序函数

可通过对数组进行排序,然后使用索引来获得最高或最低值。

Math.max() , Math.min()
    var arr = [11,2,3];
    var max = Math.max.apply(null,arr); // 11
    var min = Math.min.apply(null,[11,2,3]); // 2
    var max2 = Math.max.apply(arr); // -Infinity
自己定义函数

略……

五、数组的迭代类操作

主要指 数组迭代,过滤,按条件查找 等操作

\color{red}{item(项目值), index(项目索引), array(数组本身)}

(一) forEach()

遍历数组全部元素,利用回调函数对数组进行操作
自动遍历整个数组,且无法break中途跳出循环体
不支持 return 操作输出 和 结束函数,return只用于结束本轮循环。

    var arr = [1,2,3,4,5];
    var res = arr.forEach(function (item,index,array) {
        console.log("sss", item);
        array[index] = item + 1; // 通过数组索引改变了原数组;
        return 1; //这里加上这句之后,跳出当前循环,不会跳出函数
        array[index] = item * 10; // 不会执行这句
    });
    console.log(res);//undefined;
    console.log(arr);//[2,3,4,5,6]
image.png
    var arr = [1,2,3,4,5];
    var res = arr.forEach(function (item,index,array) {
        item --;
        console.log("sss", item);
        // array[index] = item + 1; // 通过数组索引改变了原数组;
        // return 1; //这里加上这句之后,跳出当前循环
        // array[index] = item * 10; // 不会执行这句
    });
    console.log(res);//undefined;
    console.log(arr);//[1,2,3,4,5]
可见forEach不会修改原数组,我们操作了item,原数组的元素也不会变,除非通过索引赋值

(二)map()

按照原始数组元素顺序依次操作元素
return 语句 结束本轮循环,并将 return语句后面的表达式结果,保存到一个新数组里边

    var arr = [1,2,3,4,5];
    var resArr = arr.map(function (item) {
        return  -- item; 
        console.log("sss", item); // 不会执行这一步
    });
    console.log("resArr", resArr);//[0,1,2,3,4];
    console.log("arr", arr);//[1,2,3,4,5]
image.png

(三)filter()

filter()方法筛选符合条件的元素,以数组形式输出。

(四)reduce()

(五)every()

检测是否所有元素符合条件的,return false结束函数。每一轮循环默认return false

    var arr = [1,2,3,4,5,6,7,8];
   
    var everyFlag = arr.every(function(item,index){
        console.log("index2",index);
    });
第一轮循环,默认return false,从而终止了函数

(六)some()

检测 是否所有元素中符合条件,return true 结束函数。每一轮循环默认return false

var someFlag = arr.some(function(item,index){
        console.log("index1",index);
});
每一轮循环,默认return false,故没有终止函数直到循环结束函数执行完毕

(七)indexOf(),lastIndexOf()

(八)findIndex(),find()

find() 返回符合条件的第一个元素
兼容性差

上一篇 下一篇

猜你喜欢

热点阅读