sort()方法的使用
- 在默認情況下,
sort()是按升序排列數(shù)組,sort()方法會調(diào)用每個數(shù)組項的toString()方法,比較得到的字符串,以確定如何排序。即使數(shù)組中的每一項都是數(shù)值,sort()方法比較的也是字符串。
var values = [0, 1, 5, 10, 15]
values.sort()
console.log(values) // [0, 1, 10, 15, 5]
// 例子中值得順序本身沒有問題,調(diào)用sort()方法也會根據(jù)字符串的結(jié)果改變原來的順序。
// 數(shù)值5雖然小于10,但在進行字符串比較的時候"10" 在 "5" 的前面,所以數(shù)組的順序就被修改了
-
sort()方法可以接收一個函數(shù)作為參數(shù),我們自己來指定如何進行排序 - 比較函數(shù)接收2個參數(shù),如果第1個參數(shù)應(yīng)該位于第2個參數(shù)之前返回-1,如果2個參數(shù)相等返回0,如果第1個參數(shù)應(yīng)該位于第2個參數(shù)之后返回1。
var values = [0, 1, 5, 10, 15]
values.sort((value1, value2) => {
if (value1 < value2) {
return -1
} else if (value1 > value2) {
return 1
} else {
return 0
}
})
console.log(values)
// [0, 1, 5, 10, 15]
- 需求:根據(jù)年齡大小,對對象數(shù)組進行升序排列
var objs = [
{name: "Kobe", age: 42},
{name: "YaoMing", age: 40},
{name: "Lebron", age: 36}
]
objs.sort((obj1, obj2) => {
return obj1.age - obj2.age
})
console.log(objs)
// 0: {name: "Lebron", age: 36}
// 1: {name: "YaoMing", age: 40}
// 2: {name: "Kobe", age: 42}
splice()方法的使用
splice()方法的作用:可以給數(shù)組刪除元素、替換元素、插入元素。該方法可以傳遞3個參數(shù),傳遞參數(shù)的不同可以達到不同的效果刪除元素:傳入2個參數(shù),
splice(起始位置的索引,要刪除的元素個數(shù))。
const names = ["姚明", "王治郅", "易建聯(lián)", "科比", "詹姆斯"]
names.splice(1, 2)
console.log(names) // ["姚明", "科比", "詹姆斯"]
- 替換元素:傳入3個參數(shù),
splice(起始位置的索引, 要替換的元素個數(shù), 要替換的元素(可以傳多個)) - 這里注意,第3個參數(shù)是一個可變參數(shù),可以傳入多個值。
const names = ["姚明", "王治郅", "易建聯(lián)", "科比", "詹姆斯"]
names.splice(1, 2, "霍華德", "安東尼")
console.log(names) // ["姚明", "霍華德", "安東尼", "科比", "詹姆斯"]
- 插入元素,傳入3個參數(shù),
splice(起始位置的索引,0,要插入的元素(可以傳多個)) - 這里注意:第2個參數(shù)傳0
const names = ["姚明", "王治郅", "易建聯(lián)", "科比", "詹姆斯"]
names.splice(1, 0, "霍華德", "安東尼")
console.log(names) // ["姚明", "霍華德", "安東尼", "王治郅", "易建聯(lián)", "科比", "詹姆斯"]
高階函數(shù)的使用
定義3個需求:
需求1:定義一個數(shù)字數(shù)組nums,找出數(shù)組中數(shù)值小于100的數(shù)字,放入一個新數(shù)組中newNums
需求2:將新數(shù)組(newNums)中的數(shù)字都乘以2,放入新的數(shù)組doubleNums
需求3:將doubleNums中的數(shù)字進行匯總求和
- 傳統(tǒng)做法(使用for循環(huán))
const nums = [10, 20, 30, 289, 2332, 40]
const newNums = []
for (let n of nums) {
if (n < 100) {
newNums.push(n)
}
}
console.log(newNums) // [10, 20, 30, 40]
const doubleNums = []
for (let n of newNums) {
doubleNums.push(n * 2)
}
console.log(doubleNums) // [20, 40, 60, 80]
let total = 0
for (let n of doubleNums) {
total += n
}
console.log(total) // 200
- 使用數(shù)組的高階函數(shù)
-
filter()-
filter()函數(shù)接收一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)接收一個參數(shù),這個參數(shù)就是遍歷數(shù)組時的每一個元素 - 回調(diào)函數(shù)必須要返回一個
boolean類型 - 如果返回的是
true,那么就將傳遞過來的參數(shù),加入到一個新的數(shù)組中 - 如果返回的是
false,那么就將傳遞過來的參數(shù)忽略掉 - 當
filter()函數(shù)執(zhí)行完畢后,會返回過濾后的新的數(shù)組。
-
// 使用filter()函數(shù)改寫需求1
const nums = [10, 20, 30, 289, 2332, 40]
const newNums = nums.filter((n) => {
return n < 100
})
console.log(newNums); // [10, 20, 30, 40]
-
map()-
map()函數(shù)接收一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)同樣接收一個參數(shù),這個參數(shù)是遍歷數(shù)組時的每一個元素 - 回調(diào)函數(shù)同樣有一個返回值,
map()函數(shù)會將回調(diào)函數(shù)的返回值放入到一個新的數(shù)組 - 當
map()函數(shù)執(zhí)行完畢之后,將新的數(shù)組作為返回值返回
-
// 使用map()函數(shù)改寫需求2
const doubleNums = newNums.map((n) => {
return n * 2
})
console.log(doubleNums) // [20, 40, 60, 80]
-
reduce():可以用來匯總結(jié)果-
reduce()函數(shù)接收2個參數(shù),第1個參數(shù)接收一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)接收2個參數(shù),該回調(diào)函數(shù)執(zhí)行的次數(shù)就是遍歷的次數(shù) - 回調(diào)函數(shù)的第1個參數(shù),上一次遍歷匯總的結(jié)果
- 回調(diào)函數(shù)的第2個參數(shù),每次遍歷的數(shù)組的元素
- 第2個參數(shù)是匯總的初始值
-
reduce()函數(shù)執(zhí)行完畢后,返回匯總后的值
-
// 使用reduce()函數(shù)改寫需求3
const total = doubleNums.reduce((previousValue, n) => {
return previousValue + n
}, 0)
console.log(total) // 200
- 通過使用高階函數(shù),可以進行鏈式調(diào)用,將三個函數(shù)連在一起,完成上面的三個需求,這種編程范式就是函數(shù)式編程
const nums = [10, 20, 30, 289, 2332, 40]
const total = nums.filter((n) => {
return n < 100
}).map((n) => {
return n * 2
}).reduce((previousValue, n) => {
return previousValue + n
}, 0)
console.log(total) // 200
持續(xù)更新~~~