JS-part4.1-数组常用方法


13-17参数相同

数组常用方法

数组常用方法
 + 就是 JS 自带的一些操作数组的方法
 + 数组常用方法的使用格式,必须是 数组.xxx()
     => length 和 索引 都一样,循环遍历都一样
     => 长得也一样
     => 唯独数组常用方法,伪数组用不了

数组常用方法1_(浏览器都可用)

1. push()

=> 语法: 数组.push(数据1, 数据2, 数据3, …);
=> 作用:把所有的参数按照顺序添加到数组的末尾位置
=> 返回值:追加以后数组的长度
=> 直接操作原始数组
// 1. push()
var arr = ['hello', 'world', '你好', '世界'];
var res= arr.push('新来的', '新来的2', [10, 20]);
console.log(res);
console.log(arr);

在这里插入图片描述

2. pop()

=> 语法: 数组.pop();
=> 作用:删除数组的最后一个数据
=> 返回值:被删除的数据
=> 直接操作原始数组,不需要参数
// 2. pop()
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.pop();
console.log(res);
console.log(arr);

在这里插入图片描述

3. unshift()

=> 语法: 数组.unshift(数据1, 数据2, 数据3, …);
=> 作用:从数组的最前面插入一些数据
=> 返回值:插入后数组的长度
=> 直接操作原始数组
// 3. unshift()
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.unshift('新来的');
console.log(res);
console.log(arr);

在这里插入图片描述

注:unshift()操作相比于push(),除了位置的不同,还有性能消耗的不同。前者消耗性能更大。

4. shift()

=> 语法: 数组.shift();
=> 作用:删除数组的最前面的一个数据
=> 返回值:被删除的数据
=> 直接操作原始数组,不需要参数
// 4. shift()
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.shift();
console.log(res);
console.log(arr);

在这里插入图片描述

数组常用方法2_ES3.0(IE6\7\8都可用)

5. reverse()

=> 语法: 数组.reverse();
=> 作用:反转数组
=> 返回值:反转后的数组
=> 直接操作原始数组,无参数
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.reverse();
console.log(res);
console.log(arr);

在这里插入图片描述

6. sort()

=> 语法: 
   1. 数组.sort();
       -> 按照每一个数据中的每一位数据的ASCII码进行排列
   2. 数组.sort(function(a, b){return a - b;});
       -> 升序排列
   3. 数组.sort(function(a, b){return b - a;});
       -> 降序排列
=> 作用:数组排序
=> 返回值:排序后的数组
=> 直接操作原始数组
// 1. 按照每一个数据中的每一位数据的ASCII码进行排列
var arr = [1, 11, 33, 26, 51, 19, 32, 27, 15, 100];
var res = arr.sort();
console.log(res);
console.log(arr);

在这里插入图片描述

// 2. 升序排列
var res = arr.sort(function(a, b){return a - b;});
console.log(res);
console.log(arr);

在这里插入图片描述

// 3. 降序排列
var res = arr.sort(function(a, b){return b - a;});
console.log(res);
console.log(arr);

在这里插入图片描述

7. splice()

=> 语法: 
    1. 数组.splice(开始索引, 多少个);
        -> 从开始索引,截取多少个
        -> 第二个参数可以不写,直接截取到末尾
    2. 数组.splice(开始索引, 多少个, 替换数据1, 替换数据2……);
        -> 把替换数据按照顺序插入到你截取的位置
        -> 注意:**从哪个索引开始删除,替换数据的第一个就插入哪个位置**
=> 作用:有两个
    1. 截取数组
    2. 替换新内容
=> 返回值:一定是一个数组
    -> 如果你截取多个数据,数组里面有多个
    -> 如果你截取一个数据,数组里面有一个
    -> 如果你一个都不截取,那么是一个空数组
=> 直接操作原始数组
// 7. splice()
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.splice(1, 2);

console.log('res:', res);
console.log('arr:',arr);

在这里插入图片描述

var arr = ['hello', 'world', '你好', '世界'];
var res = arr.splice(1, 2, '新来的');
// var res = arr.splice(1, 0, '新来的');
console.log('res:', res);
console.log('arr:',arr);
// ['hello', '新来的', '世界']
// ["hello", "新来的", "world", "你好", "世界"]

在这里插入图片描述

注:操作原始数组,插入是插入到原始数组里,而不是返回值里

8. concat()

=> 语法: 数组.concat(数组1, 数据2, …);
=> 作用:
    -> 如果参数是数组,那么把数组拆开,里面的每一项追加到原数组的后面
    -> 如果参数是数据,那么直接追加
=> 返回值:追加好的数组
=> **不改变原始数组**,融合进一个新的
// 8. concat()
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.concat([10, 20],[30, 40], 100);
console.log(res);
console.log(arr);

在这里插入图片描述

9. slice()

=> 语法: 
   1. 数组.slice(开始索引, 结束索引);  -包前不包后
        -> 两个参数都可以不写,分别表示从第一个开始 和 到最后一个结束
   2. 数组.slice(开始索引, 结束索引);  -包前不包后
        -> 参数可以写一个负整数
        -> 当你书写完一个负整数以后,表示length + 负整数
=> 作用:
    -> 获取数组里面的某些数据
=> 返回值:一个数组
    -> 如果你获取多个数据,数组里面有多个
    -> 如果你获取一个数据,数组里面有一个
    -> 如果你一个都不获取,那么是个空数组
=> **不改变原始数组**

注: splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改

// 9. slice()
// 语法1
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.slice(1, 2);
console.log('res:', res);
console.log('arr:',arr);

// 语法2
// 因为 length 是 4,-3 的位置实际上是4 + -3,是1;-2 的位置实际上相当于 4 + -2, 就是2
var res2 = arr.slice(-3, -2);
console.log('res:', res);
console.log('arr:',arr);

在这里插入图片描述

10. join()

=> 语法: 数组.join('连接符号'); 
        -> 不传递,是按照 逗号(,) 连接
        -> 你传递什么,按照什么连接
=> 作用:把数组里面的每一个数据使用连接符号连接在一起
=> 返回值:是一个连接好的内容,是个string类型
=> **不改变原始数组**
// 10. join()
var arr = ['hello', 'world', '你好', '世界'];
var res = arr.join('@-@');
console.log('res:', res);
console.log('arr:',arr);

在这里插入图片描述

var res = arr.join();

在这里插入图片描述

var res = arr.join('');

在这里插入图片描述

数组常用方法3_ES5.0(IE6\7\8不可用了)

11. indexOf()

=> 语法:
  1. 数组.indexOf(数据)
  2. 数组.indexOf(数据, 开始索引)
    -> 从哪个索引开始向后查找
=> 作用:正向查看数组里面指定这个数据的索引
=> 返回值:
    -> 如果有这个数据,是第一个满足条件的数据的索引
    -> 如果没有这个数据,就是 -1
// 11. indexOf()
var arr = ['hello', 'world', '你好', '世界','hello'];
var res1 = arr.indexOf('hello');
console.log(res1);    // 0
console.log(arr);

var res2 = arr.indexOf('hello', 1);
console.log(res2);    // 4
console.log(arr);

var res3 = arr.indexOf('hello', 10);
console.log(res3);    // -1
console.log(arr);

12. lastIndexOf()

=> 语法:
  1. 数组.lastIndexOf(数据)
  2. 数组.lastIndexOf(数据, 开始索引)
    -> 从哪个索引开始向前查找
=> 作用:反向查看数组里面指定这个数据的索引
=> 返回值:
    -> 如果有这个数据,是第一个满足条件的数据的索引
    -> 如果没有这个数据,就是 -1
    -> 注意:虽然是反向查找,索引还是正常的
// 12. lastIndexOf()
var arr = ['hello', 'world', '你好', '世界','hello'];
var res = arr.lastIndexOf('hello');
console.log(res);    // 4
console.log(arr);

var res2 = arr.lastIndexOf('hello', 3);
console.log(res2);    // 0
console.log(arr);

13. forEach()

=> 语法:数组.forEach(function(item, index, arr){})
    -> item: 数组的每一项
    -> index: 数组的每一项索引
    -> arr: 原始数组
=> 作用:取代 for 循环的作用,遍历数组
=> 没有返回值

注: 三个参数名可自定义;
在不考虑性能的情况下,可以用forEach代替for循环遍历数组

// 13. forEach()
var arr = ['hello', 'world', '你好', '世界'];
arr.forEach(function(item, index, arr){
    // 这个函数,会根据数组里面有多少个数据执行多少回
    // console.log('我执行了');
    // 这个函数每一次执行的时候, item 分别是数组里的每一项
    // 这个函数每一次执行的时候, index 分别是数组里每一项的索引
    // 这个函数每一次执行的时候, arr 每一次都是原始数组
    console.log(item, '---', index, '---', arr);
});

在这里插入图片描述

14. map()

=> 语法:数组.map(function(item, index, arr){})
    -> item: 数组的每一项
    -> index: 数组的每一项索引
    -> arr: 原始数组
=> 作用:映射数组
=> 返回值:是一个新的数组
    -> 里面是对原始数组每一个数据的操作
    -> 返回值数据,一定和原始数组长度一样
=> 不改变原始数组

map 底层封装
1. 准备一个新的数组
2. 遍历原始数组,分别执行函数
3. 依次把函数执行后的返回值放在新数组里面
4. 把新数组当作 map 的返回值给出来

 var arr = [10, 100, 1000];
 var res = arr.map(function(item, index, arr){
     console.log(item, '---', index, '---', arr);

     return item * 1.3;
 });

 console.log(res);

在这里插入图片描述

*/
// 自己写的一个函数
// 我要想用,必须是 myMap(a, b, c)
// 我为了可以像数组常用方法一样的话
// 我需要把这个方法放在 Array.prototype 上

function myMap(fn){
    // fn 就是你调用 myMap 的时候传递的函数

    var newArr = [];

    //这个函数里面 this 表示调用方法的那个数组
    for(var i = 0; i < this.length; i++){
        newArr.push(fn(this[i], i, this));
    }
    return newArr;
}

Array.prototype.myMap = myMap;
var res = arr.myMap(function(item, index, arr){
    console.log(item, index, arr);

    return item * 1.3;
});
console.log(res);

15. filter()

=> 语法:数组.filter(function(item, index, arr){})
    -> item: 数组的每一项
    -> index: 数组的每一项索引
    -> arr: 原始数组
=> 作用:过滤原始数组中的数据,把满足条件的放在新数组里
=> 返回值:是一个新的数组,里面是所有原始数组中满足条件的项
=> 不改变原始数组
// 15. filter()
var arr = [10, 20, 30, 40, 50];
var res = arr.filter(function(item, index, arr){
    return item > 20;
});

console.log(res);

/*
  底层封装
    1. 准备一个新数组
    2. 循环遍历原始数组
        -> 数组有多少项,函数执行多少回
        -> 每一回,如果返回值是true,那么就把这一项放在新数组里
    3. 把新数组当作filter的返回值

    newArr = [];

    函数第一次执行
        => item === 10, return item > 20, return false
        => 10 这个数据就不放在新数组里面
    函数第二次执行
        => item === 20, return item > 20, return false
        => 20 这个数据就不放在新数组里面
    函数第三次执行
        => item === 30, return item > 20, return true
        => 30 这个数据放在新数组里面
    函数第四次执行
        => item === 40, return item > 20, return true
        => 40 这个数据放在新数组里面
    函数第五次执行
        => item === 50, return item > 20, return true
        => 50 这个数据放在新数组里面
    
    循环结束
    把 newArr 当作 filter 方法的返回值
*/

在这里插入图片描述

16. every()

=> 语法:数组.every(function(item, index, arr){})
    -> item: 数组的每一项
    -> index: 数组的每一项索引
    -> arr: 原始数组
=> 作用:判断原始数组里是否每一个都满足条件
=> 返回值:是一个布尔值
    -> 如果原始数组中每一个都满足条件,那么返回值为true
    -> 只要原始数组中有任意一个不满足条件,就返回false
// 16. every()
var arr = [10, 20, 30, 40, 50];
var res = arr.every(function(item, index, arr){
    console.log(item, index, arr);

    return item < 40;
});

console.log(res);

/*
  底层原理
    1. 假设一个变量为true,表示所有数据都满足条件
    2. 循环遍历数组
        => 执行传递进来的函数
        => 如果该函数返回的是true,那么循环继续
        => 如果函数返回的是false, 那么把我的假设改成false,直接结束循环
    3. 循环结束以后,把我的假设当作 every 的返回值

    var flag = false;

    函数第一次执行
        item === 10, return item < 40,return true
        什么也不做,循环继续
    函数第二次执行
        item === 20, return item < 40,return true
        什么也不做,循环继续
    函数第三次执行
        item === 30, return item < 40,return true
        什么也不做,循环继续
    函数第四次执行
        item === 40, return item < 40,return false
        把 flag 赋值为 false
        break 结束循环
    
    循环结束后,把flag的值返回
*/

在这里插入图片描述

17. some()

=> 语法:数组.some(function(item, index, arr){})
                -> item: 数组的每一项
                -> index: 数组的每一项索引
                -> arr: 原始数组
=> 作用:判断原始数组里是否有某一个满足条件
=> 返回值:是一个布尔值
    -> 如果原始数组中任意一个数据满足条件,那么返回值为true
    -> 只要原始数组中所有数据都不满足条件,就返回false
// 17. some()
var arr = [10, 20, 30, 40, 50];
var res = arr.some(function(item, index, arr){
    console.log(item, index, arr);

    return item > 10;
});
console.log(res);

/*
   底层原理
     1. 假设一个变量为false,表示所有数据都不满足条件
     2. 循环遍历数组
         => 执行传递进来的函数
         => 如果该函数返回的是 false,那么循环继续
         => 如果函数返回的是 true, 那么把我的假设改成true,那么结束循环
     3. 循环结束以后,把假设变量 当作 some 的返回值

     var flag = true;

     函数第一次执行
         item === 10, return item > 10,return false
         什么也不做,循环继续
     函数第二次执行
         item === 20, return item > 10,return true
         把 flag 赋值为 true
         break 结束循环
     
     循环结束后,把flag的值返回
 */

数组常用方法4_ES2015(6.0)以后(标准浏览器IE10以上)

18. copyWithin()

=> 语法:数组.copyWithin(目标位置,开始索引,结束索引)
    -> 目标位置:当你替换内容的时候,从哪一个索引位置开始替换
    -> 开始索引:数组哪一个索引位置开始当作替换内容,默认值是 0
    -> 结束索引:数组哪一个索引位置结束当作替换内容,默认是末尾
    -> 包前不包后
=> 作用:使用数组里面的内容替换数组里面的内容
=> 返回值: 是一个新的数组
    -> 替换后的数组
// 18. copyWithin()
var arr = [100, 200, 300, 400, 500];
// 第一个参数 0, 表示从索引 [0] 位置,即值为100时开始替换
// 第二个参数 3, 表示原始数组索引[3]位置开始向后查找,若没写第三个参数,默认到末尾
// 找到的就是 400 和 500
// 把 400 和 500 两个数据从 [0] 开始替换;400换100, 500换200
var res = arr.copyWithin(0, 3); // [400, 500, 300, 400, 500]
var res = arr.copyWithin(0, 2); // [300, 400, 500, 400, 500]
// 第三个参数 4, 表示原始数组索引[4]位置结束查找
// 找到的就是[3] 开始 [4] 结束,包前不包后,找到的就是 400
// 把 400 从 0 开始替换
var res = arr.copyWithin(0, 3, 4); // [400, 200, 300, 400, 500]
console.log(res);

19. fill()

=> 语法:数组.fill(要填充的数据,开始索引,结束索引)
                -> 要填充的数据:你想用什么数据填充数组里面的每一位
                -> 开始索引:从数组哪一个索引位置开始填充,默认值是 0
                -> 结束索引:填充到哪一位索引为止,默认值是末尾
                -> 前提:数组要有length
                -> 包前不包后
=> 作用:使用数组指定内容去填充数组
=> 返回值:填充好的数组
// 19. fill()
var arr = new Array(30);
// 使用字符串'填充内容'去把数组填满
// var res = arr.fill('填充内容');
// 使用字符串'填充内容'从[5]开始填充数组,填充到末尾
// var res = arr.fill('填充内容', 5);
// 使用字符串'填充内容'从[5]开始填充到数组索引[25]
var res = arr.fill('填充内容', 5, 25);
console.log(res);

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

20. includes()

=> 语法:数组.includes(数据)
=> 作用:查看数组中是不是有某一个数据
=> 返回值:一个布尔值
    -> 有这个数据, 就是true
    -> 没有这个数据, 就是false
// 20. includes()
var arr = [10, 20, 30, 40, 50];
var res = arr.includes(50);  // true
console.log(res);

21. flat()

=> 语法:数组.flat(数字)
                -> 数字:表示扁平化多少层,可以不写,默认为1
                -> 数字这个参数还可以填写Infinity(大写I),表示无限
=> 作用:拍平数组
=> 返回值:拍平后的数组
// 21. flat()
var arr = [
    10, 20, 30,
    [40, 50],
    [60, 70, [80, [90, [100, [100, [120]]]]]]  
];
var res = arr.flat(3);   //拍3层
var res = arr.flat(Infinity);   //拍无限层

console.log(res);
console.log(arr);

在这里插入图片描述

22. flatMap()

=> 语法:数组.flatMap(function(item, index, arr){})
=> 作用:拍平数组,但是只能拍一层
=> 返回值:是一个新的数组
    -> 一边拍平,一边映射
// 22.flatMap()
var arr = [[10, 21, 30], [40, 51, 60]];
var res = arr.flatMap(function(item){
    return item.filter(function(item){return item % 2 === 0});
})
console.log(res);

在这里插入图片描述

23. find()

=> 语法:数组.find(function(item){})
=> 作用:根据条件找到数组里面满足条件的数据
=> 返回值:找到的第一个的那个**数据**
// 23. find()
var arr = [10, 20, 30, 40, 50];
var res = arr.find(function(item){
    return item > 20;
})
console.log(res);  // 30

24. findIndex()

=> 语法:数组.findIndex(function(item){})
=> 作用:根据条件找到数组里面满足条件的数据
=> 返回值:找到的第一个的那个数据的**索引**
// 24. findIndex()
var arr = [10, 20, 30, 40, 50];
var res = arr.findIndex(function(item){
    return item > 20;
})
console.log(res);  // 2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值