之前就想過整理數(shù)組方法的旦事,但是一直沒有時間,現(xiàn)在趁有時間整理下
- 首先來說創(chuàng)建數(shù)組的方式青灼,目前好像是兩種,一種是構(gòu)造函數(shù)妓盲,一種是直接賦值空數(shù)組
// 構(gòu)造函數(shù)
var arr = new Array(); // 創(chuàng)建一個空數(shù)組
// 賦值空數(shù)組
var arr = []; // 創(chuàng)建空數(shù)組
數(shù)組方法也有很多杂拨,咱們一步一步來吧。首先數(shù)組方法分為原型方法(原生方法)和從Object對象繼承的方法悯衬。
- 首先講
isArray()
弹沽,這個方法主要是為了判斷某變量是否為js數(shù)組,返回值是一個布爾類型筋粗,為true
則是js數(shù)組策橘,為false
則不是,咱們看看下面例子:
var arr = [1,2,3];
Array.isArray(arr);
// true
-
toString()
,這個方法是把數(shù)組轉(zhuǎn)換為數(shù)組值(逗號分隔)的字符串娜亿。如:
var arr = [1,2,3];
arr.toString();
// "1,2,3"
-
join()
這個方法也可將所有數(shù)組元素結(jié)合為一個字符串役纹。它的行為類似toString()
,但是我們還可以規(guī)定分隔符暇唾,如果我們不規(guī)定,它則默認的是逗號( 辰斋,)策州,如:
var arr = [1,2,3];
// 不規(guī)定分隔符
arr.join();
// "1,2,3"
// 規(guī)定分隔符
arr.jion('-');
// "1-2-3"
// 方法不改變原數(shù)組,比如繼續(xù)看arr
arr // [1,2,3]
-
push()
和pop()
push()
:可以接收任意數(shù)量的參數(shù)宫仗,把它們逐個添加到數(shù)組末尾够挂,并返回修改后數(shù)組的長度。
pop()
:數(shù)組末尾移除最后一項藕夫,減少數(shù)組的 length 值孽糖,然后返回移除的項。
咱們先來看push()
var arr = [1,2,3];
arr.push(4,5,6); // 6 這個6就是返回的數(shù)組長度
console.log(arr)
// [1,2,3,4,5,6] // 已改變了原數(shù)組
接著看pop()
// 這次我們不用數(shù)字來做操作,方便大家區(qū)分
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
arr.pop(); // 返回值' f ',這個' f '就是被刪除的值
console.log(arr); // 得出以下結(jié)果
['a', 'b', 'c', 'd', 'e']
-
shift()
和unshift()
shift()
:刪除原數(shù)組第一項毅贮,并返回刪除元素的值办悟;如果數(shù)組為空則返回undefined 。
unshift()
: 將參數(shù)添加到原數(shù)組開頭滩褥,并返回數(shù)組的長度 病蛉。
// 首先我們來看shift()
var arr = ['a','b','c'];
arr.shift(); // 'a' // 返回刪除元素
console.log(arr)
['b','c'] // 已改變原數(shù)組
// 如果數(shù)組為空,返回undefined
var arr = [];
arr.shift(); // undefined
接下來我們看看unshift()
var arr = ['a','b','c'];
arr.unshift('1'); // 4 // 返回添加后數(shù)組長度
console.log(arr)
['1','a','b','c'] // 已改變原數(shù)組
-
sort()
sort()
:按升序排列數(shù)組項——即最小的值位于最前面瑰煎,最大的值排在最后面铺然。
在排序時,sort()方法會調(diào)用每個數(shù)組項的 toString()轉(zhuǎn)型方法酒甸,然后比較得到的字符串魄健,以確定如何排序。即使數(shù)組中的每一項都是數(shù)值插勤, sort()方法比較的也是字符串沽瘦,因此會出現(xiàn)以下的這種情況:
var arr = ['d','a','c','b'];
arr.sort();
console.log(arr)
['a','b','c','d'] // 原數(shù)組被改變
// 接著看
var arr = [13, 24, 51, 3];
arr.sort();
console.log(arr);
[13, 24, 3, 51] // 原數(shù)組被改變
// 所以遇到這樣的情況革骨,使用的時候最好是封裝成一個函數(shù)
// 升序排序函數(shù)
function sortNumber(a,b){
return a - b
}
var arr = [13, 24, 51, 3];
arr.sort(sortNumber);
console.log(arr)
[3, 13, 24, 51] // 升序
// 降序排序函數(shù)
function NumDescSort(a,b){
return b - a;
}
var arr = [13, 24, 51, 3];
arr.sort(NumDescSort)
console.log(arr)
[51, 24, 13, 3]
-
reverse()
reverse()
:反轉(zhuǎn)數(shù)組項的順序。
var arr = [13, 24, 51, 3];
console.log(arr.reverse()); //[3, 51, 24, 13]
console.log(arr); //[3, 51, 24, 13](原數(shù)組改變)
-
concat()
concat()
:將參數(shù)添加到原數(shù)組中其垄。這個方法會先創(chuàng)建當(dāng)前數(shù)組一個副本苛蒲,然后將接收到的參數(shù)添加到這個副本的末尾,最后返回新構(gòu)建的數(shù)組绿满。在沒有給 concat()方法傳遞參數(shù)的情況下臂外,它只是復(fù)制當(dāng)前數(shù)組并返回副本。
var arr = [1,3,5,7];
var arr1 = arr.concat(9,[11,13]);
console.log(arr1);
[1, 3, 5, 7, 9, 11, 13]
console.log(arr);
[1, 3, 5, 7] // 原數(shù)組未被修改
-
slice()
slice()
:可從已有的數(shù)組中返回選定的元素喇颁。
語法:arrayObject.slice(start,end)
參數(shù) | 描述 |
---|---|
start | 必需漏健。規(guī)定從何處開始選取。如果是負數(shù)橘霎,那么它規(guī)定從數(shù)組尾部開始算起的位置蔫浆。也就是說,-1 指最后一個元素姐叁,-2 指倒數(shù)第二個元素瓦盛,以此類推。 |
end | 可選外潜。規(guī)定從何處結(jié)束選取原环。該參數(shù)是數(shù)組片斷結(jié)束處的數(shù)組下標(biāo)。如果沒有指定該參數(shù)处窥,那么切分的數(shù)組包含從 start 到數(shù)組結(jié)束的所有元素嘱吗。如果這個參數(shù)是負數(shù),那么它規(guī)定的是從數(shù)組尾部開始算起的元素滔驾。 |
返回值
返回一個新的數(shù)組谒麦,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。
如果 end 未被規(guī)定哆致,那么 slice() 方法會選取從 start 到數(shù)組結(jié)尾的所有元素绕德。
var arr = [1,3,5,7,9,11];
var arr1 = arr.slice(1); // 默認從第0個開始,截取到下標(biāo)為1(不包括該元素)
console.log(arr1);
[3, 5, 7, 9, 11]
var arr2 = arr.slice(1,4); // 從第1個開始摊阀,截取到下標(biāo)為4(不包括該元素)
console.log(arr2);
[3, 5, 7]
var arr3 = arr.slice(1,-2); // 從第1個開始迁匠,截取到下標(biāo)為-2,也就是下標(biāo)為4(不包括該元素)驹溃,
// 和slice(1,4)相同
console.log(arr3);
[3, 5, 7]
var arr4 = arr.slice(-4,-1);
// 從第-4開始城丧,反過來從-1開始數(shù),-4的位置在下標(biāo)2豌鹤,到-1亡哄,也就是下標(biāo)5,
// 可以理解為slice(2,5)布疙,第2截取到第5(不包括該元素)
console.log(arr4);
[5, 7, 9]
console.log(arr);
[1, 3, 5, 7, 9, 11] // 原數(shù)組沒變
// 如果還不清楚截取位置蚊惯,還可以往下看
var arr = [1,3,5,7,9,11];
arr.slice(0,1) // 返回[1]
arr.slice(0,2) // 返回[1,3]
arr.slice(0,3) // 返回[1,3,5]
arr.slice(0,-1) // 返回[1,3,5,7,9]
arr.slice(0,-2) // 返回[1,3,5,7]
-
splice()
splice()
方法向/從數(shù)組中添加/刪除項目愿卸,然后返回被刪除的項目。
注釋:該方法會改變原始數(shù)組截型。
語法:arrayObject.splice(index,howmany,item1,.....,itemX)
參數(shù) | 描述 |
---|---|
index | 必需趴荸。整數(shù),規(guī)定添加/刪除項目的位置宦焦,使用負數(shù)可從數(shù)組結(jié)尾處規(guī)定位置发钝。 |
howmany | 必需。要刪除的項目數(shù)量波闹。如果設(shè)置為 0酝豪,則不會刪除項目。 |
item1, ..., itemX | 可選精堕。向數(shù)組添加的新項目孵淘。 |
返回值: 包含被刪除項目的新數(shù)組,如果有的話
splice()
方法可刪除從 index 處開始的零個或多個元素歹篓,并且用參數(shù)列表中聲明的一個或多個值來替換那些被刪除的元素瘫证。
如果從 arrayObject
中刪除了元素,則返回的是含有被刪除的元素的數(shù)組庄撮。
var arr = [1,3,5,7,9,11];
// 從第0個元素開始痛悯,刪除2個元素
var arrRemoved = arr.splice(0,2); // 返回值[1,3]
console.log(arr);
// [5, 7, 9, 11]
// 從第2個位置開始,刪除0個元素重窟,添加元素4,添加元素6
var arrRemoved2 = arr.splice(2,0,4,6); // 刪除0個元素惧财,返回值[]
console.log(arr);
// [5, 7, 4, 6, 9, 11]
// 從第1個元素開始巡扇,刪除1個元素,添加元素2垮衷,添加元素4
var arrRemoved3 = arr.splice(1,1,2,4); // 返回值[7]
console.log(arr);
// [5, 2, 4, 4, 6, 9, 11]
-
indexOf()
和lastIndexOf()
indexOf()
:接收兩個參數(shù):要查找的項和(可選的)表示查找起點位置的索引厅翔。其中, 從數(shù)組的開頭(位置 0)開始向后查找搀突。
lastIndexOf
:接收兩個參數(shù):要查找的項和(可選的)表示查找起點位置的索引刀闷。其中, 從數(shù)組的末尾開始向前查找仰迁。
這兩個方法都返回要查找的項在數(shù)組中的位置甸昏,或者在沒找到的情況下返回-1。在比較第一個參數(shù)與數(shù)組中的每一項時徐许,會使用全等操作符施蜜。
var arr = [1,3,5,7,7,5,3,1];
console.log(arr.indexOf(5));
// 2
console.log(arr.lastIndexOf(5));
// 5
console.log(arr.indexOf(5,2));
// 2
console.log(arr.lastIndexOf(5,4));
// 2
console.log(arr.indexOf("5"));
// -1
// indexOf方法就是,如果查找到有雌隅,那么返回該元素位置翻默,如果沒有缸沃,則返回-1,所以我們一般寫判斷都是
// if(arr.indexOf('5') != -1) 或者if(arr.indexOf('5') > -1)
-
map()
map()
:指“映射”修械,對數(shù)組中的每一項運行給定函數(shù)趾牧,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
下面代碼利用map方法實現(xiàn)數(shù)組中每個數(shù)求平方肯污。
var arr = [1, 2, 3, 4, 5];
var arr2 = arr.map(function(item){
return item*item;
});
console.log(arr2); //[1, 4, 9, 16, 25]
// 我們也可以拿來做接口映射翘单,比如
let r = res.map(item => {
return {
title: item.name,
sex: item.sex === 1? '男':item.sex === 0?'女':'保密',
age: item.age,
avatar: item.img
}
})
-
forEach()
forEach():對數(shù)組進行遍歷循環(huán),對數(shù)組中的每一項運行給定函數(shù)仇箱。這個方法沒有返回值县恕。參數(shù)都是function類型,默認有傳參剂桥,參數(shù)分別為:遍歷的數(shù)組內(nèi)容忠烛;第對應(yīng)的數(shù)組索引,數(shù)組本身权逗。
var arr = [1, 2, 3, 4, 5];
arr.forEach(function(x, index, a){
console.log(x + '|' + index + '|' + (a === arr));
});
// 輸出為:
// 1|0|true
// 2|1|true
// 3|2|true
// 4|3|true
// 5|4|true
-
filter()
filter()
:“過濾”功能美尸,數(shù)組中的每一項運行給定函數(shù),返回滿足過濾條件組成的數(shù)組斟薇。
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var arr2 = arr.filter(function(x, index) {
return index % 3 === 0 || x >= 8;
});
console.log(arr2);
// [1, 4, 7, 8, 9, 10]
-
every()
every()
:判斷數(shù)組中每一項都是否滿足條件师坎,只有所有項都滿足條件,才會返回true堪滨。
var arr = [1, 2, 3, 4, 5];
var arr2 = arr.every(function(x) {
return x < 10;
});
console.log(arr2);
// true
var arr3 = arr.every(function(x) {
return x < 3;
});
console.log(arr3);
// false
-
some()
some()
:判斷數(shù)組中是否存在滿足條件的項胯陋,只要有一項滿足條件,就會返回true袱箱。
var arr = [1, 2, 3, 4, 5];
var arr2 = arr.some(function(x) {
return x < 3;
});
console.log(arr2);
// true
var arr3 = arr.some(function(x) {
return x < 1;
});
console.log(arr3);
// false
-
reduce()
和reduceRight()
先說說reduce()
reduce()
方法接收一個函數(shù)作為累加器遏乔,數(shù)組中的每個值(從左到右)開始縮減,最終計算為一個值发笔。
reduce()
可以作為一個高階函數(shù)盟萨,用于函數(shù)的compose
。
注意:reduce()
對于空數(shù)組是不會執(zhí)行回調(diào)函數(shù)的了讨。
然后是reduceRight()
reduceRight()
方法的功能和reduce()
功能是一樣的捻激,不同的是reduceRight()
從數(shù)組的末尾向前將數(shù)組中的數(shù)組項做累加。
注意:reduce()
對于空數(shù)組是不會執(zhí)行回調(diào)函數(shù)的前计。
// es6中reduce()方法
// 從左往右開始
// 參數(shù):
// prev:它是上一次調(diào)用回調(diào)時返回的結(jié)果胞谭,每次調(diào)用的結(jié)果都會給prev
// cur:當(dāng)前的元素
// index:當(dāng)前的索引
// arr:循環(huán)的數(shù)組
// 返回值:
// ----------函數(shù)累計處理的結(jié)果
var a = [1,2,3,4,5,6,7,8,9,10]
var str = a.reduce(function(prev,cur,index,arr){
return prev + cur ;
})
str // 55;
// ------------將二維數(shù)組轉(zhuǎn)換成一維
str // (10) [0,1, 2, 3, 4, 5, 6, 7, 8, 9]
// 數(shù)組去重
var arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
var str = arr.sort().reduce((prev, cur)=>{
if(prev.length===0 || prev[prev.length-1]!==cur){
prev.push(cur);
}
return prev;
}, []);
str // (5) [1, 2, 3, 4, 5]
// es6中reduceRight()方法
// 從右往左開始
// 方法是一樣的
// -------------函數(shù)累計處理的結(jié)果
var a = [1,2,3,4,5,6,7,8,9,10]
var str = a.reduceRight(function(prev,cur,index,arr){
return prev + cur ;
})
str // 55;
// 方法是一樣的,只不過是方法名改變下男杈,但是結(jié)果是不會變的
- 現(xiàn)在有些例子,類似于數(shù)組去重
通過使用Set
對象和...
運算符能夠使用數(shù)組里的唯一值去創(chuàng)建一個新的數(shù)組
var arr = [1,2,2,3,4,4,3,5,6,5,6,7,7,8,8,9,9,10,10,1];
var arr1 = [...new Set(arr)];
console.log(arr1);
// [1,2,3,4,5,6,7,8,9,10] // 打印結(jié)果
到這里了韭赘,如果對你有幫助,幫忙點個贊唄~~