JS数组方法总结

407 阅读4分钟

数组方法:

  1. arr.splice(start,删除元素个数,添加元素1,元素2) 删除数组元素(并替换 改变原数组
  2. arr.slice(start,end) 返回一个新数组,将所有从索引 start 到 end(不包括 end)的数组项复制到一个新的数组
  3. arr.concat(arr1,arr2,1,2) 拼接数组 生成一个新数组 可以传入数组或者值
  4. arr.forEach((item,index,array)=>{}) 函数作为一个参数 为数组的每个元素都运行一个函数。该函数没有返回值

数组搜索:按索引

  1. arr.indexOf(item, from) 从索引 from 开始搜索 item,如果找到则返回索引,否则返回 -1。
  2. arr.lastIndexOf(item, from) —— 和上面相同,只是从右向左搜索。
  3. arr.includes(item, from) —— 从索引 from 开始搜索 item,如果找到则返回 true(译注:如果没找到,则返回 false) 注意:
  • 这些方法使用的是严格相等 === 比较 所以如果我们搜索 false,会精确到的确是 false 而不是数字 0。
  • 如果我们想检查是否包含某个元素,并且不想知道确切的索引,那么 arr.includes 是首选。
  • 此外,includes 的一个非常小的差别是它能正确处理NaN, 而不像 indexOf/lastIndexOf

数组搜索:按特定条件搜索

  1. arr.find((item,index,array)=>{...})如果返回 true,则返回 item 并停止迭代;对于假值(falsy)的情况,则返回 undefined

  2. arr.findIndex(()=>{}) 同find 凡是返回的是找到元素的索引而不是元素本身,并且在未找到任何内容时返回 -1。

  3. arr.filter(()=>{}) find直接返回第一个符合条件的元素,如果有多个可以用filter,返回的是所有匹配元素组成的数组

转换数组:

  1. arr.map((item,index,array)=>{}) 它对数组的每个元素都调用函数,并返回结果数组
  2. arr.sort(): 对数组进行 原位(in-place) 排序
  3. arr.reverse() 颠倒数组中的元素,改变原数组,也返回颠倒后的数组
  4. str.split(',',3) 将字符串中逗号处分隔为字符串并取出前三个元素返回新数组
  5. arr.join(',')使用逗号连接数组返回一个字符串
  6. reduce() 累加器 let value =arr.reduce(function(accumulator, item, index, array){// ...},[initial]);
let arr = [1, 2, 3, 4, 5];
let result = arr.reduce((sum, current) => sum + current, 0);
alert(result); // 15

检查是否为数组:

  1. Array.isArray(arr) 返回布尔值 可以区别对象和数组
  2. arr.some(fn)
  3. arr.every(fn) 对数组的每个元素调用函数 fn。如果任何/所有结果为 true,则返回 true,否则返回 false。

其他

  1. arr.fill(value, start, end) —— 从索引 start 到 end,用重复的 value 填充数组。
  2. arr.copyWithin(target, start, end) —— 将从位置 start 到 end 的所有元素复制到 自身 的 target 位置(覆盖现有元素)。
  3. arr.flat(depth)/arr.flatMap(fn) 从多维数组创建一个新的扁平数组。
    1. 展开多维数组,该方法返回一个新数组,对原数据没有影响。
    2. flat() 方法的参数是一个整数,表示想要拉平的层数,默认为1,表示拉平一层。如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数
  4. Array.of(element0[, element1[, …[, elementN]]]) 基于可变数量的参数创建一个新的 Array 实例,而不需要考虑参数的数量或类型
  5. entries(),keys() 和 values() 方法 三个方法都返回一个遍历器对象,可以用for...of循环进行遍历

数组方法的应用

遍历数组

  • 当我们需要遍历一个数组时 —— 我们可以使用 forEach,for 或 for..of。
  • 当我们需要遍历并返回每个元素的数据时 —— 我们可以使用 map。

数组去重

使用Set

let arr = [100, 234, 2342,1112, 100, 300, '100', 'hello', 'hello', NaN, NaN];
let newArr = [...new Set(arr)]; 

使用reduce+includes

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

数组拷贝

浅拷贝

  1. 扩展运算符 var newArr = [...arr]
  2. 利用concat方法,不写参数 var newArr = arr.concat();
  3. 利用数组截取 var newArr = arr.slice(0)

深拷贝

  1. JSON
let obj2=JSON.parse(JSON.stringify(obj1));
  1. 递归实现
//定义函数 获取对象的构造函数(类)名
function getObjectClass(obj) {
    return Object.prototype.toString.call(obj).slice(8,-1)
}
//深拷贝的函数
function deepClone(obj) {
    //判断obj是对象是数组还是其他
    if (getObjectClass(obj) === 'Object') {
        var res = {};   //创建空的对象
    } else if (getObjectClass(obj) === 'Array') {
        var res = [];   //创建空数组
    } else {
        return obj;  //直接把参数返回
    }
    //对传入的对象(遍历)进行遍历
    for (let i in obj) {
        res[i] = deepClone(obj[i]);
    }
    //返回新数组或对象
    return res;
}