js中字符串常用方法、数组常用方法

字符串

1.indexOf/lastIndexOf
        const str = 'kdwofwad'
        let index = str.indexOf('w')
        console.log(index)
        let index1 = str.lastIndexOf('w')
        console.log(index1)
        let index2 = str.indexOf('w',3)//找出索引为3位置之后出现w字符串的位置
        console.log(index2)//5
        let index3 = str.indexOf('w',6)//找出索引为6位置之后出现w字符串的位置
        console.log(index3)//-1
        let index4 = str.lastIndexOf('w',1)//找出索引为3位置之后出现w字符串的位置
        console.log(index4)//-1
2.slice():截取字符串
//需求:手机号的迷糊处理
const str = '17698451396'
let res1 = str.substr(0,3)
let res2 = str.slice(str.length-4)
console.log(res1+'*'.repeat(4)+res2)//176****1396

数组

1.Array.of():返回具有可变数量参数的新数组实例。
     const arr = new Array(3)//数组中会创建3个元素,但是都是空的[empty × 3]
     console.log(arr.length)//3
     console.log(arr[0],arr[1],arr[2])//undefined undefined undefined

     const arr1 = Array.of(3)//只会创建一个元素,就是[3]
     console.log(arr1)//[3]
     const arr2 = Array.of('f','g','h')//创建三个元素
     console.log(arr2)//["f", "g", "h"]
2.Array.from():将具有length属性的类数组对象转为数组。转为数组还有更简单的一种写法:[...XXX]
      let spans = document.querySelectorAll('span')
      let spansArr = Array.from(spans)
      console.log(spansArr)//[span,span]

      let str = '时间多我发'
      let res = Array.from(str)
      console.log(res)//["时", "间", "多", "我", "发"]
3.concat(arr2):将两个一维数组合并为一个数组,二维数组不行。
var arr3 = [1,2,3]
var arr2 = [1,2,3]
var arr4 = arr3.concat(arr2)
console.log(arr4)
4.slice(start,[end]):截取数组的一部分或者复制整个数组,返回新数组。
var arr = [1,2,3,4,5,6]
var arr1 = arr.slice(1,4)
console.log(arr1)//[2,3,4]
----------------------------------
var arr2 = arr.slice()
console.log(arr2)// [1,2,3,4,5,6]
5.splice(start,howmany,[item1,item2,...]):截取数组一部分或者替换数组元素、添加新的数组元素。
var arr = [1,2,3,4]
var arr1 = arr.splice(1,3)//截取一部分
console.log(arr1)//[2,3,4]
-----------------------------------
var arr= [1,2,3,4]
arr.splice(2,1,'嘿')//替换数组中某元素
console.log(arr)//[1, 2, "嘿", 4]
--------------------------------------
var arr = [1,2,3,4]
arr.splice(2,0,'嘿')//插入新元素
console.log(arr)//[1, 2, "嘿", 3, 4]

封装一个可以移动数组内元素位置的函数。

      function arrayMove(array,from,to){
        if(from < 0 || to > array.length){
            return
        }
        const newArray = [...array]
        let item = newArray.splice(from,1)
        newArray.splice(to,0,...item)
        return newArray
      }
      const arr1 = ['解读为','都还好','待会代付','还无法']
      let newarray = arrayMove(arr1,0,2)
      console.log(newarray)
6.sort():对数组元素进行排序
6.1 sort()在没有参数时,参数在比较前都会通过toString()方法转换为字符串,按照Ascii进行排序?
const arr = [10,5,40,25,1000,1]
console.log(arr.sort())//[1, 10, 1000, 25, 40, 5]
6.2很明显上面不是我想要的排序结果
const arr = [10,5,40,25,1000,1]
function sortNumber(a,b){ //比较函数作为sort()的参数,如果a<b,则a排在b的前面,如果a>b,则a排在b的后面
    return a - b
}
console.log(arr.sort(sortNumber)) //[1, 5, 10, 25, 40, 1000]
console.log(arr.sort((a,b) => a - b))//[1, 5, 10, 25, 40, 1000]

6.3 sort()的简单实现原理
  function sort(array,callback){
      for(let n in array){
        for(let m in array){
          if(callback(array[n],array[m])<0){
            let temp = array[m]
            array[m] = array[n]
            array[n] = temp
          }
        }
      }
      return array
    }
   const arr = [8,3,7,21,89,45,12]
   console.log(sort(arr,function(a,b){
     return a - b
   }))//[3, 7, 8, 12, 21, 45, 89]

数组排序的方法有很多:冒泡排序(也叫选择排序)、快速排序、插入排序。
冒泡排序:这种排序思想是将大的元素移动到数组末尾。

  function maoPaoSort(arr) {
        if(arr.length <=1) return arr
        for(j = 0;j<arr.length;j++){
            let isOk = true
            for(let i = 0;i < arr.length-1-j;i++){ //一次for循环能把一个最大值确定出来
                let a = arr[i]
                let b = arr[i+1]
                if(a>b){
                    arr[i] = b
                    arr[i+1] = a
                    isOk = false
                }
            }
            if(isOk){ //排序完成后,结束循环
                break
            }
        }
        return arr
    }
   const arr = [6,2,5,1,10,7,3,4]
    console.log(maoPaoSort(arr))
      //j=0,i=0,a=6,b=2,(a>b)=>arr=[2,6,5,1,10,7,3,4]
      //j=0,i=1,a=6,b=6,(a>b)=>arr=[2,5,6,1,10,7,3,4]
      //j=0,i=2,a=6,b=1,(a>b)=>arr=[2,5,1,6,10,7,3,4]
      //j=0,i=3,a=6,b=10,(a<10)=>arr=[2,5,1,6,10,7,3,4]
      //j=0,i=4,a=10,b=7,(a>b)=>arr=[2,5,1,6,7,10,3,4]
      //j=0,i=5,a=10,b=3,(a>b)=>arr=[2,5,1,6,7,3,10,4]
      //j=0,i=6,a=10.b=4,(a>b)=>arr=[2,5,1,6,7,3,4,10]
      //j=0,i=7,内部第一次for循环结束,此次循环找出了数组中的最大值,并且把最大值排在了数组的最后
      //再次进行循环,步骤同第一次循环,找出剩余数组中的最大值,并排在数组的最后
      //直至所有元素排序结束
      //如果此时外部for循环未结束,为了保证性能,需要创建一个标识isOk停止外部的for循环

快速排序:不理解,没学会

 function quickSort(arr) {
        if(!Array.isArray(arr)){
          return
        }
        var len = arr.length;
        //结束递归的条件
        if (len <= 1) return arr;
        var left = [];
        var right = [];
        var res = []
        //中间基数
        var midindex = Math.floor(len / 2);
        var mid = arr[midindex];
        for (var i = 0; i < len; i++) {
            if (arr[i] == mid) continue;
            else if (arr[i] < mid) left.push(arr[i]);
            else right.push(arr[i]);
        }
        let l1 = quickSort(left)
        let r1 = quickSort(right)
        return res.concat(l1,mid,r1)
      }

      const arr = [6,2,5,1,10,7,3,4]
      console.log(quickSort(arr))

插入排序:这种思路是将小的元素往前移。

function insertSort(arr) {
        var len = arr.length;
        for (var i = 0; i < len; i++) {
            var k = i;
            while (k - 1 >= 0 && arr[k] < arr[k - 1]) {
                var temp = arr[k];
                arr[k] = arr[k - 1];
                arr[k - 1] = temp;
                k--;
            }
        }
        return arr;
    }
    const arr = [23, 12,32,5,21]
    console.log(insertSort(arr))
// arr = [a,b,c,d,e,f]
//思路:首先前两个数组元素比较大小,如果b<a,则a和b互换。此时,新数组为[b,a,c,d,e,f]。反之,不用换
//然后,拿c与a比较,如果c<a,则c与a互换,数组变为[b,c,a,d,e,f]。反之,不用换
//继续拿c与b比较,如果c<b,则c与b再互换,数组变为[c,b,a,d,e,f]。反之,不用换。至此,当前排序完成一部分
//继续完成剩余排序
//比较d与a的大小,如果d<a,则d与a互换位置,反之不用换。
//剩下的比较思路都是一样的。
7.shift():获取数组的第一个元素或者说是删除数组的第一个元素。
8.pop():获取数组的最后一个元素或者说是删除数组的最后一个元素。
9.unshift(元素):往数组的开头添加新的元素,返回值是新数组的长度。
10.indexOf()/lastIndexOf():同字符串的用法
 const arr = [1,2,3,45,293,2,83,3,4,3]
      let index1 = arr.indexOf(3,4)
      console.log(index1)
      let index2 = arr.indexOf(2,4)
      console.log(index2)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355