【JS】- 数组遍历的几种方法

1、for、forEach、for...of

const list = [1,2,3,4,5]
list.forEach((item, index, list) => {
  console.log(item); // 1 2 3 4 5
  console.log(index); // 0 1 2 3 4
});

forEach 无法跳出循环
for 和 for ..of 可以使用 break 或者 continue 跳过或中断
for 遍历数组索引
for ...of 直接访问的是实际元素

2、some、every

var list = [{name: 'minihu'}, {name: 'minihu1'}, {name: 'minihu2'}]

const isSome = list.some(m => m.name === 'minihu'); // true
// 若某一元素满足条件,返回 true,循环中断;所有元素不满足条件,返回 false

const isEvery = list.every(m => m.name.indexOf("minihu") >= 0); // true
// 若有一个元素不满足条件,返回 false,循环中断;所有元素满足条件,返回 true

 

3、filter、map

const list = [
  {
    id: 1
  }, {
    id: 2
  }
]
const newList = list.map(m => m.id)
// newList: [1,2]
const newList = list.filter(m => m.id === 1)
// newList: [{id: 1}]

二者都是生成一个新数组,都不会改变原数组(不包括遍历对象数组是,在回调函数中操作元素对象)
二者都会跳过空元素
map 会将回调函数的返回值组成一个新数组,数组长度与原数组一致
filter 会将符合回调函数条件的元素组成一个新数组,数组长度与原数组不同
map 生成的新数组元素是可自定义
filter 生成的新数组元素不可自定义,与对应原数组元素一致

4、find、findIndex

const list = [
  {
    id: 1
  }, {
    id: 2
  }
]
const result = list.find(m => m.id === 1)
// result: { id: 1 }
const index = list.findIndex(m => m.id === 1)
// index: 0

二者都是用来查找数组元素
find 方法返回数组中满足 callback 函数的第一个元素的值。如果不存在返回 undefined
findIndex 它返回数组中找到的元素的索引,而不是其值,如果不存在返回 -1

5、reduce、reduceRight

reduce 方法接收两个参数,第一个参数是回调函数(callback) ,第二个参数是初始值(initialValue)
reduceRight 方法除了与reduce执行方向相反外(从右往左),其他完全与其一致

回调函数接收四个参数:
a) accumulator:MDN 上解释为累计器,但我觉得不恰当,按我的理解它应该是截至当前元素,之前所有的数组元素被回调函数处理累计的结果
b) current:当前被执行的数组元素
c) currentIndex: 当前被执行的数组元素索引
d) sourceArray:原数组,也就是调用 reduce 方法的数组

如果不传入初始值,reduce 方法会从索引 1 开始执行回调函数,如果传入初始值,将从索引 0 开始、并从初始值的基础上累计执行回调。

// 计算对象数组某一属性的总和
const list  = [
  { name: 'left', width: 20 },
  { name: 'center', width: 70 },
  { name: 'right', width: 10 },
];
const total = list.reduce((currentTotal, item) => {
  return currentTotal + item.width;
}, 0);
// total: 100
// 对象数组的去重,并统计每一项重复次数
const list  = [
  { name: 'left', width: 20 },
  { name: 'right', width: 10 },
  { name: 'center', width: 70 },
  { name: 'right', width: 10 },
  { name: 'left', width: 20 },
  { name: 'right', width: 10 },
];
const repeatTime = {};
const result = list.reduce((array, item) => {
  if (repeatTime[item.name]) {
    repeatTime[item.name]++;
    return array;
  }
  repeatTime[item.name] = 1;
  return [...array, item];
}, []);
// repeatTime: { left: 2, right: 3, center: 1 }
// result: [
//   { name: 'left', width: 20 },
//   { name: 'right', width: 10 },
//   { name: 'center', width: 70 },
// ]
// 对象数组最大/最小值获取
const list  = [
  { name: 'left', width: 20 },
  { name: 'right', width: 30 },
  { name: 'center', width: 70 },
  { name: 'top', width: 40 },
  { name: 'bottom', width: 20 },
];
const max = list.reduce((curItem, item) => {
  return curItem.width >= item.width ? curItem : item;
});
const min = list.reduce((curItem, item) => {
  return curItem.width <= item.width ? curItem : item;
});
// max: { name: "center", width: 70 }
// min: { name: "left", width: 20 }

 

转载自:https://juejin.cn/post/6966390357005172773

posted @ 2021-05-28 11:49  迷你胡丶  阅读(361)  评论(0编辑  收藏  举报