title: JS数组三
date: 2020-06-13 17:43:17
tags:
- JavaScripe查漏补缺
- sort(),reduce()
关于sort()方法
- 接受的是一个函数,返回排序后的数组
let arr=[9,5,2,7]
let result = arr.sort(function (a,b) {
//return a-b//返回负数从小到大,[2, 5, 7, 9]
//return b-a//返回正数从大到小,[9, 7, 5, 2]
})
console.log(result)
let arr=[9,5,2,7]
//定义sort,冒泡实现,动态的(反复调用callback)
function sort(arr,callback) {
for (const n in arr) {
for (const m in arr) {
//一个很奇怪的排序,单纯看返回值,每次都会调用
if (callback(arr[n], arr[m]) < 0) {//接受实参,返回一个数(正或者负),这个callback会被反复调用,每次都判断
let temp = arr[n]
arr[n] = arr[m]
arr[m] = temp
}
}
}
return arr
}
//调用sort
let result = sort(arr,function (a,b) {//两个形参要在调用时接受实参
return b-a
})
console.log(result)
关于reduce()方法
reduce(callbacks(pre,cur,index,arr),init)
,它会存储上一次运行的结果作为下一次运行的第一个参数。pre一开始是第一个值,后面就是上次函数运行的结果,cur从第二个值开始。**最终返回所有元素运行后的结果。**可用作统计用途(统计器,累加器,最大值等等,利用其保存上一次运行结果的特点)
let arr = [1, 2, 3, 4, 5, 6]
let res = arr.reduce((pre, cur) => {
console.log(pre)//1,3,6,10,15,21//默认pre是第一个数
console.log(cur)//2,3,4,5,6
return pre + cur
})
console.log(res)//21
let res2=arr.reduce((pre, cur) => {
console.log(pre)//0,1,3,6,10,15,21,pre有初始值后,pre和cur的位置都会前移,也就是cur才是第一个数,pre初始值采用所给值而与原数组无关
console.log(cur)//1,2,3,4,5,6
return pre + cur
},0)//0是prev的初始值,如果这里是1,那么最后结果会变成22
console.log(res2)//21
//获取价格超过1万元商品的名称,当然filter更加方便。
let cart = [
{ name: "iphone", price: 12000 },
{ name: "imac", price: 25000 },
{ name: "ipad", price: 3600 }
];
function getNameByPrice(goods, price) {
return goods
.reduce(function(arr, cur) {
if (cur.price > price) arr.push(cur);
return arr;
}, [])//令arr的初值为一个数组,初值的类型可以有很多种。
.map(function(item) {
return item.name;
});//链式调用
}
console.table(getNameByPrice(cart, 10000));
reduce非常好用,要多用!!!
includes与reduce联合使用在去重的时候很常用。
经典问题,如果没有要求自己写排序,那么直接调用内部提供的排序
生成一个100W的数组,随机打乱,再排序
function solution() {
let arr = shengcen(100)
arr = daruan(arr)
//用自带的sort排序
arr = arr.sort((a, b) => a - b)
console.log(arr)
}
solution()//调用
//数组生成
function shengcen(num) {
let arr = []
for (let i = 0; i < num * 10000; i++) {
arr[i] = i + 1
}
return arr
}
//数组打乱
function daruan(arr) {
let max = arr.length
for (let i = 0; i < max - 1; i++) {//减去1是因为random是闭区间的。因为只需要交换n-1次。n个数交换n-1次。
let j = i + Math.floor(Math.random() * (max - i));//j是随机数
[arr[i], arr[j]] = [arr[j], arr[i]]//随机互换
}
return arr
}
//打乱还有一个利用随机排序的打乱
function daruan2(arr){
return arr.sort(()=>Math.random()-0.5)//不要传递参数
}