数组方法ES5 + ES6

发布时间 2023-05-28 17:31:24作者: 前端-大雄

 


 

sort / reverse

主要用于排序,会影响原来数组。
const arr = [1, 2, 3]
arr.sort(); // 正序
arr.reverse(); // 反序
arr.sort(() => 0.5 - Math.random()); // 乱序

 

 


 

splice

编辑元素,会影响原来数组

// splice(目标下标, 删除多少元素, 插入元素);
const arr = [1, 2, 3]
console.log(arr, arr.splice(0, 0, '我')) // ['我', 1, 2, 3] // 增加元素
console.log(arr, arr.splice(0, 1, '我')) // ['我', 2, 3] // 替换元素,返回被替换元素
console.log(arr, arr.splice(0, 1)) // [2, 3] // 删除目标下标元素,返回被删除元素

 

 


slice

根据指定开始结束截取数组,不会影响原来数组

const arr = [1, 2, 3, 4, 5, 6]
console.log(arr.slice(0, 2)); // [1, 2] // 截取段

 

 


map

返回处理后的元素,不会影响原来数组

const arr = [
  { name: 'tom', age: 17 },
  { name: 'anne', age: 16 },
  { name: 'jack', age: 18 },
]
// 返回数组,数组的元素为原始数组元素调用函数处理后的值
console.log(arr.map(item => item.name)); // ['tom', 'anne', 'jack']

 

 

 


filter / find

过滤数组元素,不会影响原来数组

const arr = [1, 2, 3, 2]
// filter: 返回数组,循环所有元素,返回所有符合条件的元素
console.log(arr.filter(item => item === 2)); // [2, 2]
// find: 返回单个元素,只要有一个元素符合条件立即结束循环并返回元素
console.log(arr.find(item => item === 2)); // 2

 

 


 

some / every

是否存在元素,不会影响原来数组
some运行过程:
return true : 立即结束循环,最终结果为true
return false : 继续循环,直到所有元素都遍历一次,如果遍历所有元素都是false,最终结果为false

every运行过程:
return true : 继续循环,直到所有元素都遍历一次,如果遍历所有元素都是ture,最终结果为true
return false : 立即结束循环,最终结果为false
const arr = [1, 2, 3]
// some:只要有一项返回true,则返回true
console.log(arr.some(item => item === 2)); // true
// every:必须所有项返回true,才返回true;一旦有一项返回flase,就返回flase
console.log(arr.every(item => item >= 2)); // flase

 

 


shift / unshift / pop

编辑数组,会影响原来数组

const arr = [1, 2, 3]
// shift: 删除数组第一个元素并返回删除元素
console.log(arr, arr.shift()); // [2, 3], 1

 

// unshift: 向数组的开头添加一个元素,并返回数组长度
const arr = [1, 2, 3]
console.log(arr, arr.unshift(0)); // [0, 1, 2, 3], 4

 

 

const arr = [1, 2, 3]
// 删除数组最后一个元素并返回删除的元素
console.log(arr, arr.pop()); // [1, 2], 3

 

 


join:

指定分隔符连接数组元素,不填任何符号就默认用逗号,会影响原来数组

const arr = [1, 2, 3]
console.log(arr.join("-")); // 1-2-3

 

 


for of / for in

遍历数组,不会影响原来数组

// for of 拿到是数组对象value,主要用作遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象
const arr = [
  { name: 'tom', age: 17 },
  { name: 'anne', age: 16 },
  { name: 'jack', age: 18 },
]
for (const item of arr) {
  console.log(item);
}
// 通过entries获得下标与元素
for (const [i, item] of arr.entries()) {
  console.log(i, item);
}

 

 

// for in 拿到是数组对象key,主要用作遍历对象
// 跳出这次循环:return
// forEach没有跳出整个循环的方法,但可以用异常的方式来跳出,可这种方法太不友好
const obj = { name: 'tom', age: 17 }
for (const key in obj) {
  const item = obj[key]
  console.log(key, item);
}

 

 


 

forEach

// 常用于遍历数组,循环无法中途跳出,break return 都无效
// 语法: array.forEach(callbackFn(item, index, arr), thisValue)
// 参数: item-当前元素 index-下标 arr-被循环数组 thisValue-执行回调函数 callbackFn 时,用作 this 的值
const arr = [
  { name: 'tom', age: 17 },
  { name: 'anne', age: 16 },
  { name: 'jack', age: 18 },
]
arr.forEach((item, index, arr) => {
  console.log(item, index, arr);
})

 

 


reduce / reduceRight

一篇写的很好的reduce教程:https://www.cnblogs.com/amujoe/p/11376940.html
reduce主要用于循环数组进行累计、累加
reduceRight与reduce用法相同,只是遍历顺序相反

// 做汉堡包为例子
const list = [
  { name: '生菜', icon: '?' },
  { name: '西红柿', icon: '?' },
  { name: '酸黄瓜', icon: '?' },
  { name: '奶酪', icon: '?' },
  { name: '牛肉饼', icon: '?' },
  { name: '面包', icon: '?' },
]
const init = { name: '面包', icon: '?' }
// 语法: array.reduce((prev, cur, index, arr)=>{}, init);
// 参数
// init 初始值
// arr 被循环数组
// prev 上一次调用回调返回值或者初始值
// cur 当前元素
// index 当前元素下标, 若有 init 值,则下标为0否则为1
const hamburger = list.reduce((prev, cur, index, arr) => {
  // console.log(prev, cur, index, arr);
  console.log(prev, cur);
  return {
    name: `${prev.name}/${cur.name}`,
    icon: `${prev.icon}${cur.icon}`,
  }
}, init);
console.log(`${hamburger.icon}===?`);