数组的方法

参考:https://blog.csdn.net/MessageBox_/article/details/81225071

添加元素:push、unshift、concat、splice。

文章目录

  1. 改变元有数组

push、pop、shift、unshift、reverse、sort、splice、

  1. 不改变原有数组

join、forEach、concat、slice、
map、some、every、filter、reduce
indexOf、find、findIndex、

  1. ES6数组的扩展

扩展运算符、
Array.from()、Array.of()、
arr.copyWithin()、arr.fill()、arr.includes()、arr.flat()、


1.方法会改变原有数组

相应的方法有:unshift、shift、push、pop、reverse、sort、splice

push后面添加,pop后面删除
shift和unshift是一对,那么都是前面的;unshift字多,那么是添加,shift是删除。

unshift:向数组开头添加元素,并返回新的长度
var arr = [1,2,3,4];
var res = arr.unshift(0);
console.log("arr:",arr); // arr: (5) [0, 1, 2, 3, 4]
console.log("res:",res); // res: 5
shift:将第一个元素删除,并返回删除元素,空即为undefined
var arr = [1,2,3,4];
var res = arr.shift();
console.log("arr:",arr); // arr: (3) [2, 3, 4]
console.log("res:",res); // res: 1

var arr2=[];
var res2=arr2.shift();
console.log(arr2); // []
console.log(res2); // undefined
pop:删除最后一个,并返回删除的元素
var arr = [1,2,3,4];
var res = arr.pop();
console.log("arr:",arr); // arr: (3) [1, 2, 3]
console.log("res:",res); // res: 4

var arr2=[];
var res2=arr2.pop();
console.log(arr2); // []
console.log(res2); // undefined
push:向数组末尾添加元素,并返回新的长度
var arr = [1,2,3,4];
var res = arr.push(5);
console.log("arr:",arr); // arr: (5) [1, 2, 3, 4, 5]
console.log("res:",res); // 5
reverse:颠倒数组顺序
var arr = [1, 2, 3, 4];
var res = arr.reverse();
console.log("arr:", arr); // arr: (4) [4, 3, 2, 1]
console.log("res:", res); // res: (4) [4, 3, 2, 1]
sort:数组排序

默认是按照字符编码的顺序对数组中的元素进行排序;如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值。

  • 默认按照字符编码排序(默认是按照最左边的数字进行排序)
var arr = [10,3,20,41];
var res = arr.sort();
console.log("arr:",arr); // arr: (4) [10, 20, 3, 41]
console.log("res:",res); // res: (4) [10, 20, 3, 41]
  • 给予排序函数,从大到小排序

a-b,默认是升序的(a到b是升序,b到a是降序)。

var arr = [10,3,20,41];
var res = arr.sort((a,b)=>(a-b));
console.log("arr:",arr); // arr: (4) [3, 10, 20, 41]
console.log("res:",res); //res: (4) [3, 10, 20, 41]
  • 给予排序函数,从大到小排序
var arr = [10,3,20,41];
var res = arr.sort((a,b)=>(b-a));
console.log("arr:",arr); // arr: (4) [41, 20, 10, 3]
console.log("res:",res); // res: (4) [41, 20, 10, 3]
splice(start,length,item)删,增,替换数组元素,返回被删除数组

应用:可以实现删除、插入和替换。

1.此方法有三个参数,后两个可以省略
2.item可以为多个,splice(start,length,iem1,item2,item3…)

  • 一个参数:从start开始删除元素,返回删除的元素数组
var arr = [1,2,8,4,5];
var res = arr.splice(2);
console.log("arr:",arr); //arr: (2) [1, 2]
console.log("res:",res); // res: (3) [8, 4, 5]

如果从index=0开始(会改变原数组),eg:

var arr = [1,2,8,4,5];
var res = arr.splice(0);
console.log("arr:",arr); //arr: (2) []
console.log("res:",res); // res: (3) [1, 2, 8, 4, 5]

注:clone一个新数组,原数组 就为空了。

  • 两个参数:从start开始删除length个元素,返回删除的元素数组
var arr = [1,2,8,4,5];
var res = arr.splice(2,2);
console.log("arr:",arr); // arr: (3) [1, 2, 5]
console.log("res:",res); // res: (2) [8, 4]

注:用法:在前端处理数组的增删改查。eg:

// 删除:
deleteFunc(item) {
  let arr=[]; // 某个数组
  arr.forEach((v,k)=>{
    if(v.id==item.id){
      arr.splice(k,1);
    }
  })
}
  • 三个以上参数:从start开始删除length个元素,并将item及item后的参数从start处插入到数组中
var arr = [1,2,8,4,5];
var res = arr.splice(2,2,9,9,3);
console.log("arr:",arr); // arr: (6) [1, 2, 9, 9, 3, 5]
console.log("res:",res); // res: (2) [8, 4]

应用:在数组中间的某一项前面加一个值,eg:在arr[2]前面加值:
与push、pop、shift、unshift功能类似的!

var arr = [1,2,8,4,5];
var res = arr.splice(2,0,9);
console.log("arr:",arr); // arr: (6) [1, 2, 9, 8, 4, 5]
console.log("res:",res); // res: []

注:lodash中:在某个位置加元素;在某个位置删除元素;

2.方法不会改变原数组

相应的方法有:
join、forEach、concat、slice、
map、every、some、filter、reduce、
indexOf、find、findeIndex、

arr.join(separator) 将数组以separator为分隔符进行连接,并返回字符串

separator:可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

var arr = [1,2,'aa',4];

var res = arr.join('|');
var res2 = arr.join();

console.log("arr:",arr); // arr: (4) [1, 2, "aa", 4]
console.log("res:",res); // res: 1|2|aa|4
console.log(res2); // 1,2,aa,4
arr.forEach((v,k)=>{})循环调用回调函数会处理每一项,且无法正常退出循环,除非抛出异常。没有返回值(undefined)。

使用breakreturn false都不行的,可以使用try-catch来抛出异常,停止循环。

var arr = [1,2,3];
var res = arr.forEach((v,k)=>{
    console.log(k,v);
    return  2 * v;
});

console.log("arr:",arr); // arr: (3) [1, 2, 3]
console.log("res:",res); // res: undefined
arr.concat(arr1,arr2,arr3...)将数组进行拼接,不会进行去重处理,可以同时连接很多个数组,返回一个连接后的新数组

注:参数可以为单个元素、多个元素、单个数组或者多个数组。

var arr = [1,2,3];
var res = arr.concat([1,2],[3,4]);

console.log("arr:",arr); // arr: (3) [1, 2, 3]
console.log("res:",res); // res: (7) [1, 2, 3, 1, 2, 3, 4]

注:如果是值,直接放进去;如果是数组,只会去除最外一层;eg:

[1].concat(2, [3,[5]], [[4]]); // [1,2,3,[5],[4]]
[1].concat(2, [3,5], [[4]]); // [1,2,3,5,[4]]

arr.slice(start,end)数组中截取从start开始,end结束的数组。返回一个新数组。

注:与splice的区分。splice字多,参数多。参数含义也不一样的。
包括start但不包括end。[start,end)

var  arr = [1,2,3,4,5];
var  res = arr.slice(1,4);

console.log("arr:",arr); // arr: (5) [1, 2, 3, 4, 5]
console.log("res:",res); // res: (3) [2, 3, 4]
var  arr = [1,2,3,4,5];
var  res = arr.slice(0,arr.length);

console.log("arr:",arr); // arr: (5) [1, 2, 3, 4, 5]
console.log("res:",res); // res: (5) [1, 2, 3, 4, 5]
console.log(arr == res); // false
console.log(arr === res); // false

如果数组内部是引用类型的时候:

var arr = [{a:1},{b:2},{c:3},{d:4},{e:5}];
var res = arr.slice(1, 4);

console.log("arr:", arr);// [{a:1},{b:2},{c:3},{d:4},{e:5}]
console.log("res:",res); // [{b:2},{c:3},{d:4}]

// 如果修改值:
res[1].c=111;
console.log("arr:", arr);// [{a:1},{b:2},{c:111},{d:4},{e:5}]
console.log("res:",res); // [{b:2},{c:111},{d:4}]

说明:是浅拷贝,还是会互相影响的!

有负数的情况:

let str= 'abcdefg';

console.log(str.slice(0, -1)); // abcdef
console.log(str.slice(0, -2)); // abcde
console.log(str.slice(-2, 111)); // fg
console.log(str.slice(-4, 111)); // defg
console.log(str.slice(-4, 5)); // de

注:
1.第一个参数为负数,那么是从倒数第几位开始,到end结束。(负数从-1开始,没有0)。
2.第二个参数为负数,那么是从start开始,到倒数第几个。

arr.map((v,k)=>{})返回一个新的数组,新数组的每一项都是回调函数处理的结果。
var arr = [1,2,3];
var res = arr.map((v,k)=>{
    console.log(k,v);
    return  2 * v;
});

console.log("arr:",arr); // arr: (3) [1, 2, 3]
console.log("res:",res); // res: (3) [2, 4, 6]
var arr= [{name:1,value:111},{name:2,value:222}];
arr.map(o=>o.value)

// 返回的数组: [111, 222]

var arr=[
    {key:'key1',value:1,name:'a'},
    {key:'key2',value:2,name:'b'},
    {key:'key3',value:3,name:'c'},
    {key:'key4',value:4,name:'d'},
];

var newArr=arr.map((v,k)=>{
    return v.value*2; // 只会返回value这一项。
});

console.log(arr); // 不变
console.log(newArr); // [2,4,6,8]
arr.every(callback)检测数组所有元素是否都符合callback中的指定条件,返回boolean值

如果数组中检测到有一个元素不满足,则表达式返回 false ,且不再检测剩余元素。
如果所有元素都满足条件,则返回 true。
callback 被调用时传入三个参数:元素值,元素的索引,原数组。
遇假就退出,返回false。

var arr = [1,2,3];
var res = arr.every((v,k,arr)=>{
    console.log(arr); // [1, 2, 3]
    console.log(k,v); // 只执行了一次:0 1,就直接跳出了,返回结果。
    return  v>3;
});

console.log("arr:",arr); // arr: (3) [1, 2, 3]
console.log("res:",res); // res: false
arr.some(callback)检测数组中是否有符合callback中条件的元素,如果有就返回true,否则返回false

1.如果有一个元素满足条件,则表达式返回true , 且不再检测剩余元素。
如果没有满足条件的元素,则返回false。
2.callback 被调用时传入三个参数:元素的值,元素的索引,被遍历的数组。
遇真就退出,且返回true。

var arr = [1, 2, 8, 4];
var res = arr.some((val) => (val > 3));
console.log("arr:", arr);
console.log("res:", res);
//输出
//arr: (4) [1, 2, 8, 4]
//res: true
arr.filter(callback)返回数值中符合callback中条件的所有元素组成的新数组
var arr = [1, 2, 8, 4];
var res = arr.filter((v, k) => {
    console.log(k, v);
    return v > 3;
})

console.log("arr:", arr); // arr: (4) [1, 2, 8, 4]
console.log("res:", res); // res: (2) [8, 4]
var arr = [{a:1},{b:2},{c:3},{d:4},{e:5}];
var res = arr.filter((v,k)=>{
    return k!=0;
})

console.log("arr:", arr);// [{a:1},{b:2},{c:3},{d:4},{e:5}]
console.log("res:",res); // [{b:2},{c:3},{d:4},{e:5}]

res[1].c=111;
console.log("arr:", arr);// [{a:1},{b:2},{c:111},{d:4},{e:5}]
console.log("res:",res); // [{b:2},{c:111},{d:4},{e:5}]

也是浅层次的拷贝,会互相影响的!

arr.reduce(callback)

参考:https://www.cnblogs.com/leejersey/p/5466091.html

callback:执行数组中每个值的函数,包含四个参数

// 语法:
arr.reduce((previousValue, currentValue, index, array) => {
    return previousValue + currentValue;
}, initialValue)

参数:
previousValue:上一次调用回调返回的值,或者是提供的初始值(initialValue)。
currentValue 数组中当前被处理的元素。
index当前元素在数组中的索引。
array调用 reduce 的数组。
initialValue作为第一次调用 callback 的第一个参数。

注:initialValue可以省略;
如果省略的话,那么previousValue取arr[0],currentValue取arr[1];执行arr.length-1次。
如果没有省略的话,那么previousValue取initialValue,currentValue取arr[0];执行arr.length次。

 var arr = [1, 2, 3, 4, 5];
 var res = arr.reduce((prev, val, key, arr) => {
         console.log(arr); // (5) [1, 2, 3, 4, 5]
         console.log(prev, val, key); // 执行了4次,eg:
         // 1 2 1
         // 3 3 2
         // 6 4 3
         // 10 5 4
         return prev + val;
     }
 );
 console.log("arr:", arr); // arr: (5) [1, 2, 3, 4, 5]
 console.log("res:", res); //res: 15
arr.indexOf(value,index)寻找数组中值为value项的索引,如果没有符合条件的则返回 -1
var  arr = [1,2,3];
var  res = arr.indexOf(2);

console.log("arr:",arr); // arr: (3) [1, 2, 3]
console.log("res:",res); // res: 1

注:数组内为引用类型,那么是找不到的。eg:

var  arr = [
    {key:'key1',value:1,name:'a',},
    {key:'key2',value:2,name:'b',flag:true,},
    {key:'key3',value:3,name:'c',flag:false,},
];
var  res = arr.indexOf({key:'key2',value:2,name:'b',flag:true,}); // 直接复制粘贴查找第二项,找不到的;如果是arr[1],那么可以找到。
var  res2 = arr.indexOf(arr[1]);

console.log("res:",res); // res: -1
console.log("res2:",res2); // res2: 1
arr.find(callback)返回callback中符合测试条件的第一个数组元素的值,如果没有符合条件的元素返回 undefined
var arr = [1,22,23,24];
var res = arr.find((val)=> val > 22 );

console.log("arr:",arr); // arr: (4) [1, 22, 23, 24]
console.log("res:",res); // res: 23
var arr = [
    {key:'key1',value:1,name:'a',},
    {key:'key2',value:2,name:'b',flag:true,},
    {key:'key3',value:3,name:'c',flag:true,},
];
var res = arr.find((val)=> {
    return val.flag;
} );

console.log("arr:",arr); // 不变
console.log("res:",res); // {key: "key2", value: 2, name: "b", flag: true} // 有符合的就跳出了,不继续执行。
arr.findIndex(callback)返回callback中符合测试条件的第一个数组元素索引,如果没有符合条件的则返回 -1
var arr = [1, 2, 8, 4];
var res = arr.findIndex((val) => (val > 3));

console.log("arr:", arr); // arr: (4) [1, 2, 8, 4]
console.log("res:", res); // res: 2

ES6数组的扩展

1.扩展运算符(...
2.Array.from()
3.Array.of()
4.arr.copyWithin()
5.arr.find()和arr.findIndex()
6.arr.fill()
7.arr.includes()
8.arr.flat()
详见:myself:https://blog.csdn.net/weixin_42995876/article/details/87874242

判断一个数组是否为数组:
Array.isArray() 返回值为boolean值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值