这篇《25个你不得不知道的数组reduce高级用法》性能对比

  这篇文章主要介绍“JavaScript中遍历数组和对象有哪些常用的方法”,在日常操作中,相信很多人在JavaScript中遍历数组和对象有哪些常用的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中遍历数组和对象有哪些常用的方法”的疑惑有所帮助!接下来js map 遍历对象数组,请跟着小编一起来学习吧!

  数组和对象在各种编程语言中都充当着至关重要的角色,本篇文章给大家介绍一下JavaScript中常用数组遍历、对象遍历的方法和各方法间的差异js map 遍历对象数组,以及使用时的注意事项。

  数组遍历

  随着 JS 的不断发展,截至 ES7 规范已经有十多种遍历方法。下面按照功能类似的方法为一组,来介绍数组的常用遍历方法。

  for、forEach、for ...of

  <pre class="brush:js;toolbar:false;">const list = [1, 2, 3, 4, 5, 6, 7, 8,, 10, 11];
for (let i = 0, len = list.length; i  {
  if (item === 5) return;
  console.log(index); // 0 1 2 3 5 6 7 9 10
  console.log(item); // 1 2 3 4 6 7 8  10 11
});</pre>

  小结

  some、every

  <pre class="brush:js;toolbar:false;">const list = [
  { name: '头部导航', backward: false },
  { name: '轮播', backward: true },
  { name: '页脚', backward: false },
];
const someBackward = list.some(item => item.backward);
// someBackward: true
const everyNewest = list.every(item => !item.backward);
// everyNewest: false</pre>

  小结

  filter、map

  <pre class="brush:js;toolbar:false;">const list = [
{ name: '头部导航', type: 'nav', id: 1 },,
{ name: '轮播', type: 'content', id: 2 },
{ name: '页脚', type: 'nav', id: 3 },
];
const resultList = list.filter(item => {
  console.log(item);
  return item.type === 'nav';
});
// resultList: [
//   { name: '头部导航', type: 'nav', id: 1 },
//   { name: '页脚', type: 'nav', id: 3 },
// ]
const newList = list.map(item => {
  console.log(item);
  return item.id;
});
// newList: [1, empty, 2, 3]
// list: [
//   { name: '头部导航', type: 'nav', id: 1 },
//   empty,
//   { name: '轮播', type: 'content', id: 2 },
//   { name: '页脚', type: 'nav', id: 3 },
// ]</pre>

  小结

  find、findIndex

  <pre class="brush:js;toolbar:false;">const list = [
{ name: '头部导航', id: 1 },
{ name: '轮播', id: 2 },
{ name: '页脚', id: 3 },
];
const result = list.find((item) => item.id === 3);
// result: { name: '页脚', id: 3 }
result.name = '底部导航';
// list: [
//   { name: '头部导航', id: 1 },
//   { name: '轮播', id: 2 },
//   { name: '底部导航', id: 3 },
// ]
const index = list.findIndex((item) => item.id === 3);
// index: 2
list[index].name // '底部导航';</pre>

  小结

  reduce、reduceRight

  reduce 方法接收两个参数,第一个参数是回调函数(callback) ,第二个参数是初始值(initialValue)。

  reduceRight 方法除了与reduce执行方向相反外(从右往左),其他完全与其一致。

  回调函数接收四个参数:

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

  计算对象数组某一属性的总和

  <pre class="brush:js;toolbar:false;">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</pre>

  对象数组的去重,并统计每一项重复次数

  <pre class="brush:js;toolbar:false;">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 },
// ]</pre>

  对象数组最大/最小值获取

  <pre class="brush:js;toolbar:false;">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  { return false })
console.timeEnd('some')
// some: 2.786590576171875 ms
console.time('foreach');
list.forEach(() => {})
console.timeEnd('foreach');
// foreach: 3.126708984375 ms
console.time('map');
list.map(() => {})
console.timeEnd('map');
// map: 3.743743896484375 ms
console.time('forof');
for (let index of list) {
}
console.timeEnd('forof')
// forof: 6.33380126953125 ms</pre>

  从打印结果可以看出,for 循环的速度最快,for of 循环最慢

  常用遍历的终止、性能表格对比

  是否可终止

  **

  break

  continue

  return

  性能(ms)

  for

  终止 ✅

  跳出本次循环 ✅

  ❌

  2.42

  forEach

  ❌

  ❌

  ❌

  3.12

  map

  ❌

  ❌

  ❌

  3.74

  for of

  终止 ✅

  跳出本次循环 ✅

  ❌

  6.33

  some

  ❌

  ❌

  return true ✅

  2.78

  every

  ❌

  ❌

  return false ✅

  2.75

  最后,不同浏览器内核 也会有些差异,有兴趣的同学也可以尝试一下。

  对象遍历

  在对象遍历中,经常需要遍历对象的键、值,ES5 提供了 for...in 用来遍历对象,然而其涉及对象属性的“可枚举属性”、原型链属性等,下面将从 Object 对象本质探寻各种遍历对象的方法,并区分常用方法的一些特点。

  for in

  <pre class="brush:js;toolbar:false;">Object.prototype.fun = () => {};const obj = { 2: 'a', 1: 'b' };for (const i in obj) {  console.log(i, ':', obj[i]);}// 1: b// 2: a// fun : () => {} Object 原型链上扩展的方法也被遍历出来for (const i in obj) {  if (Object.prototype.hasOwnProperty.call(obj, i)) {      console.log(i, ':', obj[i]);    }}// name : a 不属于自身的属性将被 hasOwnProperty 过滤</pre>

  小结

  使用 for in 循环时,返回的是所有能够通过对象访问的、可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例。如果只需要获取对象的实例属性,可以使用 hasOwnProperty 进行过滤。

  使用时,要使用(const x in a)而不是(x in a)后者将会创建一个全局变量。

  for in 的循环顺序,参考【JavaScript 权威指南】(第七版)6.6.1。

  Object.keys

  <pre class="brush:js;toolbar:false;">Object.prototype.fun = () => {};const str = 'ab';console.log(Object.keys(str));// ['0', '1']const arr = ['a', 'b'];console.log(Object.keys(arr));// ['0', '1']const obj = { 1: 'b', 0: 'a' };console.log(Object.keys(obj));// ['0', '1']</pre>

  小结

  用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性名组成的数组。

  Object.values

  <pre class="brush:js;toolbar:false;">Object.prototype.fun = () => {};const str = 'ab';console.log(Object.values(str));// ['a', 'b']const arr = ['a', 'b'];console.log(Object.values(arr));// ['a', 'b']const obj = { 1: 'b', 0: 'a' };console.log(Object.values(obj));// ['a', 'b']</pre>

  小结

  用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性值组成的数组。

  Object.entries

  <pre class="brush:js;toolbar:false;">const str = 'ab';for (const [key, value] of Object.entries(str)) {    console.log(${key}: ${value});}// 0: a// 1: bconst arr = ['a', 'b'];for (const [key, value] of Object.entries(arr)) {    console.log(${key}: ${value});}// 0: a// 1: bconst obj = { 1: 'b', 0: 'a' };for (const [key, value] of Object.entries(obj)) {    console.log(${key}: ${value});}// 0: a// 1: b</pre>

  小结

  用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回二维数组。每一个子数组由对象的属性名、属性值组成。可以同时拿到属性名与属性值的方法。

  Object.getOwnPropertyNames

  <pre class="brush:js;toolbar:false;">Object.prototype.fun = () => {};Array.prototype.fun = () => {};const str = 'ab';console.log(Object.getOwnPropertyNames(str));// ['0', '1', 'length']const arr = ['a', 'b'];console.log(Object.getOwnPropertyNames(arr));// ['0', '1', 'length']const obj = { 1: 'b', 0: 'a' };console.log(Object.getOwnPropertyNames(obj));// ['0', '1']</pre>

  小结

  用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性名组成的数组。

  总结

  我们对比了多种常用遍历的方法的差异,在了解了这些之后,我们在使用的时候需要好好思考一下,就能知道那个方法是最合适的。欢迎大家纠正补充。

  到此,关于“JavaScript中遍历数组和对象有哪些常用的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/1857
0 评论
605

发表评论

!