一、數組便利方法合集方法
- 數據量沒有成百上千,一下方法的一般性能都不會有太大的區別
- 不會改變原數組的方法:forEach、map、filter、reduce、some、every、reduceRight、find、findIndex
- 會改變原數組的方法:fill、copyWithin
便利方法/方式 | 函數帶參 | 使用解釋 | 推薦使用場景 | 備註 |
for | - | 根據數組下標便利 | 基本通用 | |
優化的for | - | 將長度提前計算出來 | 數組較大的時候優化效果比較明顯 | |
for in | - |
|
推薦使用於對象便利(因爲便利的是鍵名) | |
for of 【es6新增】 |
- |
|
數組使用還是比較推薦的 | 可以正確響應break、continue和return語句 |
forEach |
3個參數 item:當前元素 value:當前元素索引 arr:當前操作數組 |
- |
forEach() 方法用於調用數組的每個元素,並將元素傳遞給回調函數 數據量大的時候不推薦使用耗費性能高 |
forEach不會獲取新數組也沒有return值,自動將代碼置入try finally塊 |
map | 3個參數同forEach方法 |
|
高階函數 1、要修改數組值獲取新數組可使用 2、其他 |
map方法不改變原數組,需要重新賦值獲取 |
filter | 3個參數同forEach方法 |
|
高階函數 1、要刪除某個值獲取新數組使用 2、其他 |
不改變原數組,需要重新賦值獲取 |
reduce |
第一個參數是一個回調函數(必須),第二個參數是初始值(可選) ,依次爲本輪循環的累計值、當前循環的元素(必須),該元素的下標(可選),數組本身(可選) |
|
reduce是高階函數(即可調用其他函數使用的方法)具體使用可深度調研 | 不改變原數組,返回最終操作結果 |
reduceRight | 參數同reduce |
|
同上 | 不改變原數組, |
every | 3個參數同forEach方法 |
|
判斷某個數組是否不存在某個值 | 不改變原數組 |
some | 3個參數同forEach方法 |
|
判斷某個數組是否存在某個值的時候 | 不改變原數組 |
find【es6新增】 | 第一個參數是回調函數必須,第二個參數thisValue是可選值,第一個參數裏的forEach裏面的三個參數值 |
|
判斷數組內是否包含某種條件的值的元素 |
不改變原數組,對於空數組,函數是不會執行的 |
findIndex【es6新增】 |
|
類似字符串查找的indexOf的用法,判斷數組內是否包含某種條件的值的元素。
|
不改變原數組 | |
copyWithin【es6新增】 |
|
|
copyWithin() 方法用於從數組的指定位置拷貝元素到數組的另一個指定位置中 | 會改變原數組 |
fill |
3個參數 value[必須]:填充的值 start[可選]:開始填充位置 end[可選]:停止填充位置 |
|
fill() 方法用於將一個固定值替換數組的元素。 | 會改變原數組 |
keys() 【es6新增】 |
- | 鍵名的便利- | 對象要便利鍵名的時候使用 | 它們都返回一個遍歷器對象,一般配合let of使用 |
values 【es6新增】 |
- | 鍵值的便利- | 對象要便利鍵值的時候可使用 | 它們都返回一個遍歷器對象,一般配合let of使用 |
entries 【es6新增】 |
- | 鍵值對的便利- | for (let [index, elem] of this.arr.entries()) { console.log(index, elem);} | 它們都返回一個遍歷器對象,一般配合let of使用 |
includes【es6新增】 | - |
|
判斷數中是否包含給定的值,同indexOf類似 | 可判斷undefined、NaN |
indexOf | - |
|
判斷數中是否包含給定的值 | 不可判斷undefined、NaN |
二、對象便利
- 將對象轉化成類數組再用以上方法便利即可
- 對象便利如下
方法 | 推薦使用場景 | 備註 |
for in | 一般對象均可便利 | for (let item in this.obj) { console.log("鍵名",item) //鍵名 console.log("鍵值",this.obj[item]) //鍵值} |
Object.keys | 鍵名的便利 | Object.keys(this.obj |
Object.values | 鍵值的便利 | Object.values(this.obj) |
Object.entries | 將對象便利成數組 | Object.entries(this.obj) |
Object.getOwnPropertyNames | 鍵名的便利 | Object.getOwnPropertyNames(this.obj) |
三、代碼示例
data: {
arr:[11,22,234],
obj:{aa:1,bb:2,cc:3,dd:4}
},
// 數組便利
arrFuc() {
//1、 for
for (let i = 0; i < this.arr.length; i++) {
console.log(this.arr[i]); //11、22、234
}
//2、 for優化,長度緩存數組較大時對優化效果較明顯
for (let j = 0, len = this.arr.length; j < len; j++) {
console.log(this.arr[j]); //11、22、234
}
//3、 for in
for (let k in this.arr) {
console.log(this.arr[k]); //11、22、234
}
//4、 for of ES6引進的新方法,對象需要通過和Object.keys()搭配使用,
// 可以正確響應break、continue和return語句
for (let l of this.arr) {
console.log(l); //11、22、234
}
//5、 forEach便利,參數:value數組中的當前項, index當前項的索引, array原始數組;
this.arr.forEach(item => {
console.log(item); //11、22、234
});
//6、 map的回調函數中支持return返回值可以return出來
// return的是啥,相當於把數組中的這一項變爲啥(並不影響原來的數組,只是相當於把原數組克隆一份,把克隆的這一份的數組中的對應項改變了);
var newArr = this.arr.map((item, ind, arr) => {
if (item == 22) {
return 33;
} else {
return item;
}
});
console.log("map", newArr); //map [11, 33, 234]
//7、 filter遍歷,不會改變原始數組,返回新數組,關鍵在於正確實現一個“篩選”函數。
var newArr2 = this.arr.filter(item => {
return item != 22;
}); //返回數組項不等於22的
console.log(newArr2); //[11, 234]
//8、 every是對數組中的每一項運行給定函數,如果該函數對每一項返回true,則返回true,否則返回false[返回布爾值]
var everyResult = this.arr.every((item, index, array) => {
return item > 11;
});
console.log("every方法", everyResult); //every方法 false
//9、 some()是對數組中每一項運行指定函數,如果該函數對任一項返回true,則返回true【返回布爾值】
var someResult = this.arr.some((item, index, array) => {
return item == 11;
});
console.log("some方法", someResult); //some方法 true
//10、reduce() 方法接收一個函數作爲累加器(accumulator),數組中的每個值(從左到右)開始縮減,最終爲一個值。
// reduce接受一個函數,函數有四個參數,分別是:上一次的值,當前值,當前值的索引,數組
console.log("reduce方法", this.arr.reduce((a, b) => a + b)); //reduce方法 267
//10.1、reduceRight()方法的功能和reduce()功能是一樣的,不同的是reduceRight()從數組的末尾向前將數組中的數組項做累加
//11、find()方法返回數組中符合測試函數條件的第一個元素。正確返回該數值,否則返回undefined
console.log(
"find方法",
this.arr.find(ele => {
return ele == 11;
})
); //find方法 11
console.log(
"find方法",
this.arr.find(ele => {
return ele == 111;
})
); //find方法 undefined
// 11.1\findIndex()只返回符合要求的第一個數索引
console.log(
"findIndex",
this.arr.findIndex((item, index, arr) => {
console.log(item);
return item > 20;
}),
this.arr
); //findIndex 1 (3) [11, 22, 234, __ob__: Observer]
//12、splice(start,length,item)刪,增,替換數組元素,返回被刪除數組,無刪除則不返回【會改變原數組】
this.arr.splice(0, 1, 555);
console.log("splice方法", this.arr); //splice方法 (3) [555, 22, 234, __ob__: Observer]
// 13、ES6 提供三個新的方法 —— entries(),keys()和values() —— 用於遍歷數組。它們都返回一個遍歷器對象,可以用for...of循環進行遍歷,唯一的區別是keys()是對鍵名的遍歷、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷
for (let index of this.arr.keys()) {
console.log("keys()鍵名的遍歷", index); //keys()鍵名的遍歷 0 keys()鍵名的遍歷 1 keys()鍵名的遍歷 2
}
for (let elem of this.arr.values()) {
console.log("values()鍵值的遍", elem); //values()鍵值的遍 555 values()鍵值的遍 22 values()鍵值的遍 234
}
for (let [index, elem] of this.arr.entries()) {
console.log("entries()鍵值對的遍歷", index, elem); //entries()鍵值對的遍歷 0 555 entries()鍵值對的遍歷 1 22 entries()鍵值對的遍歷 2 234
}
//14、copyWithin,3個參數第一個參數表示替換到指定索引的位置,第二個參數表示開始複製的的位置,第三個參數是結束位置,23參數沒有默認從頭開始複製, 替換到結束
console.log("原數組", this.arr); //原數組 (3) [555, 22, 234, __ob__: Observer]
this.arr.copyWithin(1, 0);
console.log("copyWithin", this.arr); //copyWithin (3) [555, 555, 22, __ob__: Observer]
//15、fill
console.log("fill", this.arr.fill(11111, 0, 2)); //fill (3) [11111, 11111, 22, __ob__: Observer]
this.arr.push("undefined");
//16、indexOf、includes
console.log(
"indexOf",
this.arr.indexOf(22),
this.arr.indexOf("undefined")
); //indexOf 2 3
console.log(
"includes",
this.arr.includes(22),
this.arr.includes("undefined")
); //includes true true
},
// 對象便利
objFuc() {
// 1、let in
for (let item in this.obj) {
console.log("鍵名", item); // 鍵名name,鍵名age
console.log("鍵值", this.obj[item]); //鍵值yan,鍵值22
}
//2、Object.keys 鍵名的便利
console.log(Object.keys(this.obj)); // ["name", "age"]
//3、Object.values 鍵值的便利
console.log(Object.values(this.obj)); // ["yan", 22]
//4、Object.entries 鍵值的便利
console.log(Object.entries(this.obj)); // 0: (2) ["name", "yan"] 1: (2) ["age", 22]
console.log(Object.getOwnPropertyNames(this.obj)); //["name", "age", "__ob__"]
for (let item of Object.keys(this.obj)) {
console.log(item); //name,age
}
}
四、總結
大家有什麼其他方法也可評論裏@我,持續更新分享!