2022年7月2日

web一些常用函数与笔记

作者 admin

。。。真实做项目中会遇到一些需求,需要一定的算法或者某些函数来解决

1.求数组交集
let arr1 =[0,2,4,5,7]
let arr2 = [0,3,5,6,8,4,9,55]
var newarr = arr1 .filter((v) => arr2 .includes(v))
//也可以用,不考虑(数组中不含NaN)
newarr = arr1.filter((v)=> arr2.indexOf(v)>-1 )
//filter方法是返回一个符合过滤条件的新数组,不改变原有的数组


2.求数组并集
arr1.concat(arr2.filter(function(v) {
return arr1.indexOf(v) === -1})) // [1,2,3,4,5]


3.求多维数组合并一维
var arr1 = [[0, 1], [2, 3], [4, 5]];
var arr2 = arr1.reduce(function (a, b) { return a.concat(b)} );
// arr2 [0, 1, 2, 3, 4, 5]


4.求字符串数组转整型
var arr2 = ["0", "1", "2", "3", "4", "5"];
var arr3 = arr2.map(Number);
console.log(arr3);//输出为:[0, 1, 2, 3, 4, 5]


5.数组去重
Array.from方法用于将两类对象转为真正的数组;
Set类似于数组,但是本身没有重复值
[...]扩展运算符 用于展开数组
1.Array.from(new Set(arr))
2.[...new Set(arr)]
3.indexOf(i) 小于0 说明不存在重复

6.二分查找法

// 给定一个有序(非降序)数组,可能含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1
        // target = 7 ,return 5
        // target = 8, return -1
        function binary_search (arr , item){
            let low = 0
            height = arr.length - 1
            while(low < height){
                let mid = parseInt((height + low) / 2)
                let guess = arr[mid]
                if(guess == item){
                    return mid
                }else if(guess > item){
                    height = mid - 1
                }else{
                    low = mid + 1
                }
            }
            return -1
        }
        let myArr = [1,2,3,5,6,7,7,10]
        console.log(binary_search(myArr,7));   // 最后输出的是7对应的索引下标 5
        console.log(binary_search(myArr,8));   // 找不到8 输出的是 -1

vue.js–动态更改css

检测表单是否输入,如果有输入 进入watch,newVal获取最新值,btnActive = true,则butsubFocus 属性选择器css生效,否则使用默认的butsub;
<input type="button" value='立即注册' class='butsub' @click="submit()" :class="{ 'butsubFocus': btnActive }">

data() {
    return {
      btnActive: false,
    }
  },

watch: {
    mobile(newVal, oldVal) {
      // watch可以监听一些状态发生更改的时候,做一些处理,修改状态,或者异步操作
      newVal != '' ? this.btnActive = true : this.btnActive = false;
    }
  },


 .butsub {
      background: #E4E5E6;
      color: #959697;
    }


 .butsubFocus {
      background: #7094F0;
      color: #FFFFFF
    }

vue.js–css操作xx时间内不允许点击



<div class="audioWrap" @click="musicPlay()" ref="audioRef" v-if="show">
            <p class="audioText">{{audioNumber}}' 
              <span class="voiceBox">
                <img src="@/images/report/voice2.png" alt="" class="voiceImg" ref="iconRef">
              </span>
            </p>
        </div>

audioNumber:'14',
audioState:false,
 musicPlay(){
      let time = this.audioNumber * 1000
      if(this.audioState == false){
        this.audioState = true;
        this.musicStatus.play();
        this.$refs.audioRef.style.pointerEvents='none'
      }
      if(this.audioState == true){
        setTimeout(()=>{
          this.audioState = false
          this.$refs.audioRef.style.pointerEvents='auto'
        },time)
      }
    },

vue.js–语音聊天喇叭动态换图


 changeIconPic(){
      var imgArr = ["https://file.coralwin.cn/2205241635527682983.png","https://file.coralwin.cn/2205241636102714284.png","https://file.coralwin.cn/2205241636226383410.png"];
      //创建一个变量,用来保存当前图片的索引
      var index = 0;
      //定义一个变量,用来保存定时器的标识
      var timer;
      //在开启定时器之前,需要将当前元素上的其他定时器关闭
      clearInterval(timer);
      /*
           * 开启一个定时器,来自动切换图片
           */
          timer = setInterval(()=>{
            //使索引自增
            index++;
            //判断索引是否超过最大索引
            if(index > imgArr.length){
              //则将index设置为0
              index = 3;
              clearInterval(timer);
            }
            this.$refs.iconRef.src= imgArr[index - 1]
          },1000);
    },

audio操作相关

放到mounted里面
this.audio = new Audio()
      this.audio.src = this.src
      this.audio.addEventListener('canplaythrough', () => {
        this.duration = this.format(this.audio.duration)
      })
      this.audio.onplay = () => {
        this.animate = true
        this.timer = setInterval(() => {
          this.animate = false
          setTimeout(() => {
            this.animate = true
          }, 50)
        }, 1250);
      }
      this.audio.onpause = () => {
        this.animate = false
        this.timer && clearInterval(this.timer)
      }
      this.audio.onended = () => {
        this.animate = false
        this.timer && clearInterval(this.timer)
      }
      window.audioList.push(this.audio) //所有实例加入全局变量
      console.log(window.audioList)
    },
    methods: {
      play() {
        if (this.audio.paused) {
          this.audio.play()
        } else {
          window.audioList.forEach(audio => { //开始前先关闭所有可能正在运行的实例
            audio.pause()
          })
        }
      },
      format(s) {
        var t = '';
        if (s > -1) {
          var min = Math.floor(s / 60) % 60;
          var sec = s % 60;

          if (min < 10) {
            t += "0";
          }
          t += min + "'";
          if (sec < 10) {
            t += "0";
          }
          t += sec.toFixed(2);
        }
        // eslint-disable-next-line no-useless-escape
        t = t.replace('.', '\"')
        return t;
      },

子盒子撑开父盒子css

原则:
1.父盒子不要设置高度,默认高度height:auto;
2.子盒子要有明确的宽高,且子盒子是 块级元素(既 float: left;)
3.最后要在父盒子下,(子盒子的兄弟节点,添加标签)
<div class="clearfloat"></div>
  .clearfloat{
    clear:both;
    height:0;
  }

css padding与margin

eg:
padding: 20px;(上、下、左、右各20px。)
padding: 20px 40px;(上、下20px;左、右40px。)
padding: 20px 40px 60px;(上20px;左、右40px;下60px。)
padding: 20px 40px 60px 80px;(上20px;右40px;下60px;左80px。)
在css中使用padding可以将padding-top,padding-right,padding-bottom,padding-left,缩写为一个标记,顺序为上右下左(顺时针)。

margin: 20px;(上、下、左、右各20px。)
margin: 20px 40px;(上、下20px;左、右40px。)
margin: 20px 40px 60px;(上20px;左、右40px;下60px。)
margin: 20px 40px 60px 80px;(上20px;右40px;下60px;左80px。)
在css中使用margin可以将margin-top,margin-right,margin-bottom,margin-left,缩写为一个标记,顺序为上右下左(顺时针)。