JS数组三


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)//不要传递参数
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值