JS中数组、字符串的方法

1,296 阅读5分钟
  • 只列举了用到过的,或者比较常用的方法

字符串的方法

charAt() 查看字符串中位于某一位的字符

conCat() 拼接两个或多个字符串,基本等于"+"

indexOf() 匹配对应字符串的位置,返回的是下标.如果目标不存在,返回-1

lastIndexOf() 匹配字符最后一次出现的位置,返回下标,不存在时返回-1

字符串的截取:

- substring(m,n) 不影响原有字符串  
    如果只有一个参数,是从这个下标开始,到字符串结束  
    如果有两个参数,从下标为m开始到下标为n结束,不包括n
- slice(m,n) 不影响原有字符串  
    如果有一个参数,从这个下标开始到结束  
    如果有两个参数,从下标为m开始到下标为n结束,不包括n,如果n为负数,意思是从字符串后面开始截取
- substr(m,n)   
    如果是一个参数,从此下标开始到字符串结束  
    如果两个参数,第一个视为下标,第二个视为长度,以下标为m开始,截取n个字符

split() 将字符串转换为数组

- 如果参数是""(空字符串),会将字符串中的每一个字符都切割出来
- 如果参数是某个字符,会根据这个字符进行切割

toLowerCase()/toUpperCase()将字符串中所有字符转化为小/大写

trim() 去除字符串两端的空格,不包括字符串中间的空格(IE8-不支持)

replace(old,new) 替换字符,只能替换匹配到的第一个字符

数组的方法

concat() 拼接数组

indexOf() 匹配元素第一次出现在数组中的位置,返回下标.不存在时返回-1

lastIndexOf() 匹配元素最后一次出现在数组中的位置,返回下标,不存在时返回-1

join()将数组转化为字符串

- 有参数:在字符串的字符之间插入该参数
- 无参数:以逗号连接字符

添加项:

* push()在数组的最后位置添加项
* unshift() 在数组的开头位置添加项
* 返回数组长度

删除项:

* pop() 删除数组末尾的一位
* shift() 删除数组第一位
* 返回删除的元素

截取数组:

* slice()
    - 一个参数时:slice(m) 从下标为m开始截取到数组结束
    - 两个参数时:slice(m,n)从下标为m开始截取到下标n,不包括n,n为负数时从后面数起
* splice()
    - 一个参数:splice(m) 从下标m开始到结束
    - 两个参数:splice(m,n)从下标m开始截取n长度,会改变原数组
    - 如果两个参数之后继续输入参数,会将参数插入到新的数组中

reverse()反转数组

sort() 对数组排序

  • arr.sort(function(a,b){return b-a}) 降序
  • arr.sort(function(a,b){return a-b}) 升序

forEach()遍历数组

  • 没有返回值
forEach(function(value,index,array){
        console.log(a,b,c)
    }) 

map():将调用的数组的每个元素传递给指定函数,并会返回一个数组,这个返回的数组将会包含每次的return.原数组不会改变

    var result = arr.map(function(x){
        return x*x;//必须要有return,不然那返回值为undefined
    })

filter()过滤

  • 会返回所有符合条件的元素
    arr.filter(function(item, index, arr){
        //...
    })
    //比如过滤掉数组中的undefined和null
    var result = arr.filter(function(x){
        return x!= undefined && x!= null;
    })

every()/some()

- every()针对数组中的所有元素,只有所有元素都符合every的条件时,才会返回true
- some()只要数组中有任何一个元素符合它的判断条件,就会返回true.
- 一旦every()和some()确认应返回的值,便会停止遍历(类似正则中的惰性查找,当every遇到某一个值不符合条件,会直接返回false,some遇到某一个值符合条件,直接返回true)

reduce():使用指定函数将数组元素进行组合,最后生成一个单个的值.可以视为"注入"、"折叠".返回值为函数执行完成后的结果

    //用reduce()进行数组求积
    var product = arr.reduce(function(x,y,z,a){
        return x*y
        // 首先x*y,然后所得值再*z,最后再*a,最后会返回所有值相乘过的结果
    })

reduceRight()

  • 工作原理和reduce()一样,不同的是它按照数组索引从高到低(从右到左)处理数组。

fill() 填充数组

  • 可以用来快速对数组进行初始化
  • 用这种方式填充的数据,引用地址都是相同的
arr.fill(value,start,end)
value:要填充的值
start:开始进行填充的下标
end:填充结束的下标(不包含end这个下标)
let arr = [1,2,3,4,5,6,7]
arr.fill(7) //[7,7,7,7,7,7,7] 只传value会将数组所有项全部初始化为value
arr.fill(7,2) //[1,2,7,7,7,7,7] 只传value和start会从start开始将后续所有项初始化为value
arr.fill(7,2,4) //[1,2,7,7,5,6,7] 传入所有参数,从start开始到end为止的项变为value

数组去重

一.用for循环和indexof、push去重

    //新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。
    function unique(arr){
        var arr2 = []
        for (let i = 0; i < arr.length; i++){
            if(arr2.indexOf(arr[i]) === -1){
                arr2.push(arr[i])
            }
        }
        return arr2
    }

二.利用ES6的Set方法去重

//使用时要考虑兼容性.这种去重方式代码量是最少的,但是有一个缺点:
//无法取出掉空对象'{}'
function unique (arr) {
     return Array.from(new Set(arr))
}
//如果你可以熟练使用ES6,可以简化为一句
[...new Set(arr)]

三.for循环嵌套,splice去重

//双重循环,外层循环元素,内层循环时比较其中的值,值相同时,删去其中一个
function unique(arr){            
        for(var i=0; i<arr.length; i++){
            for(var j=i+1; j<arr.length; j++){
                if(arr[i]===arr[j]){         //检测到重复元素则删除掉
                    arr.splice(j,1);
                    j--;
                }
            }
        }
return arr;
}

四.sort方法去重

//利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对
function unique(arr) {
    if (!Array.isArray(arr)) {//判断输入的参数是否是数组,如果不是数组直接结束
        console.log('type error!')
        return;
    }
    arr = arr.sort()//排序之后如果两个值相同,会紧挨,利用这一点,比较两个相邻的值是否相同即可
    var arrry= [arr[0]];
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] !== arr[i-1]) {
            arrry.push(arr[i]);
        }
    }
    return arrry;
}
* 此处用到了sort方法,但默认情况下sort方法比较的是字符串,并且sort方法返回的是排序后的数组,在一些情况下可能并不适用

五.includes方法

function unique(arr) {
    var array =[];
    for(var i = 0; i < arr.length; i++) {
            if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值
                    array.push(arr[i]);
              }
    }
    return array
}

六.filter方法

function unique(arr) {
  return arr.filter(function(item, index, arr) {
    //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
    return arr.indexOf(item, 0) === index;
  });
}

七.递归方式

function unique(arr) {
        var array= arr;
        var len = array.length;

    array.sort(function(a,b){   //排序后更加方便去重
        return a - b;
    })

    function loop(index){
        if(index >= 1){
            if(array[index] === array[index-1]){
                array.splice(index,1);
            }
            loop(index - 1);    //递归loop,然后数组去重
        }
    }
    loop(len-1);
    return array;
}

八.利用Map数据结构去重

//创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
function arrayNonRepeatfy(arr) {
  let map = new Map();
  let array = new Array();  // 数组用于返回结果
  for (let i = 0; i < arr.length; i++) {
    if(map .has(arr[i])) {  // 如果有该key值
      map .set(arr[i], true); 
    } else { 
      map .set(arr[i], false);   // 如果没有该key值
      array .push(arr[i]);
    }
  } 
  return array ;
}

九.reduce方法+includes方法

function unique(arr){
    return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}

总结

  • 方法看似很多,其实无非就是两种:
    1. 两层循环法
    2. 利用某些语法自身的键的不可重复性