蘑小De菇

个人技术博客

hi,我是蘑小De菇,一名前端开发者。


记录个人对技术的理解和开发过程中遇到的问题,欢迎了解更多。

怎么遍历对象、数组,怎么排序数组

对象遍历

forin

  • 可以遍历自身和原型上的所有可枚举对象
const obj = {
  name:'name',
  age:15,
  [Symbol('aa')]:'symbol' // Symbol
}

// 添加一个不可枚举属性
Object.defineProperties(obj,{
  class:{
    value:'三年级一班',
    enumerable:false
  }
})

// 给obj的原型添加属性
Object.defineProperties(obj.__proto__, {
  sex:{
    value:'',
    enumerable:true
  },
  sex1:{
    value:'女1',
    enumerable:false
  },
  [Symbol('bb')]:{
    value:'bb',
    enumerable:false
  },
  [Symbol('cc')]:{
    value:'cc',
    enumerable:true
  }
})

for(const name in obj) {
    console.log('name:', name);
    if (Object.prototype.hasOwnProperty.call(obj, name)) { // 属于对象本身的属性
      console.log('name1:', name);
    }
}

// name: name
// name1: name
// name: age
// name1: age
// name: sex

Object.keys()

  • 返回自身可枚举的属性集合
Object.keys(obj) // [name,age]

Object.getOwnPropertyNames()

  • 返回自身除symbol之外可枚举不可枚举的属性
Object.getOwnPropertyNames(obj) // [name,age,class]

Object.getOwnPropertySymbols()

  • 返回自身所有可枚举不可枚举的symbol属性
Object.getOwnPropertySymbols(obj) // [Symbol('aa')]

Reflect.ownKeys()

  • 返回自身所有属性
Reflect.ownKeys(obj) // ['name', 'age', 'class', Symbol(aa)]

Object.values()

  • 返回自身可枚举属性的值
Object.values(obj) // ['name', 15]

Object.entries()

  • 返回自身可枚举属性键值对
Object.entries(obj) // [['name','name'], ['age',15]]

总结

  • 只有forin可以遍历到原型上的属性
  • Object.getOwnPropertyNames 和 Reflect.ownKeys 可获取到不可枚举的属性
  • Object.getOwnPropertySymbols 和 Reflect.ownKeys 可获取到 Symbol 属性

数组遍历

for

  • break 结束循环
  • continue 跳出本次循环
  • return 直接跳出函数

forof

  • 遍历可迭代对象 array、string、map、set
  • break 结束循环
  • continue 跳出本次循环
let arr = [1,2,3]
for (const iterator of arr) {
  console.log(iterator)
}
// 1
// 2
// 3
let map = new Map([[1,2],[2,3]])
for (const [key,value] of map) {
  console.log(key,value)
}
// 1 2
// 2 3

forEach

  • 不改变原数组
  • 循环过程中不可以停止
  • 没有返回值(返回undefined)

map

  • 循环过程中不可以停止
  • 返回新数组
  • 不改变原数组

find/findIndex

  • find返回数组中第一个满足条件的第一个元素的值,否则返回undefined。
  • findIndex()返回满足条件的第一个元素值的索引,否则返回undefined。

filter

  • 返回符合条件的新数组

reduce / reduceRight

  • 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
  • reduce从左到右,reduceRight从右往左
const arr = [1, 2, 3]
const arrR = arr.reduce((pre, cur, item, array) => {
  pre.push(++cur)
  return pre
}, [])

console.log(arrR)
// [2, 3,4]

some/every

  • some 只要数组中有一条数据符合条件就返回true,否则false
  • every 数组的每一个元素都符合条件返回true,否则返回false

怎么排序数组

sort()

  • sort() 默认是将元素转化成字符串进行比较。对于数值型排序不很准确,sort函数可接收一个比较函数,解决这个问题
let arr = [1,3,5,50,15]
arr.sort() // [1,15,3,5,50]
正序排列
arr.sort((a,b)=>a-b) // [1,3,5,15,50]
逆序排列
arr.sort((a,b) => b-a) // [50,15,5,3,1]

算法排序

参见:算法排序