鸿蒙-数组常用方法

434 阅读6分钟

数组常用方法

一、 Array 对象常用 API

作用:数组都是 Array 的实例化对象,它提供了很多的 方法来帮助我们快速处理数据。

常用方法:

image.png

1.1、indexof方法

作用:返回数组中第一次出现给定元素的下标,如果不存在则返回 -1

语法:数组.indexof(要查找的元素)// 存在返回具体下标,不存在返回 -1

代码演示:

//使用 indexof 方法来获取元素下标
let num:number[] = [1,2,3,4,5,6]
let numindex = num.indexOf(5)
console.log('',numindex)//4

1.2、join方法

作用:将数组用逗号或指定的分隔符,将数组的每一项拼接到一起。

语法:数组.join('分隔符') // 基于传入的分隔符 将数组的每一项拼接到一起。

代码演示:

let names:string[] = ['张','王','李','刘']
console.log(names.join())//打印结果张,王,李,刘(默认逗号分隔)
console.log(names.join(''))//打印结果张王李刘(直接拼接)
console.log(names.join('-'))//打印结果张-王-李-刘(-分隔)

1.3、forEach方法

作用:forEach() 方法会遍历数组,并且将数组的每一项作为参数传入到回调函数中,无返回值。

语法:数组.forEach((数组项:类型,索引:number)=>{ // 逻辑 })

代码演示:

const arr: HeroInfo[] = [
  { id: 105, name: '廉颇', title: '正义爆轰' },
  { id: 106, name: '小乔', title: '恋之微风' },
  { id: 107, name: '赵云', title: '苍天翔龙' },
  { id: 108, name: '墨子', title: '和平守望' },
]

arr.forEach((item)=>{
  console.log(item.name,item.title)
})

1.4、map方法

作用:可以基于原有数组中的数据,生成一个新数组。

语法:数组.map<返回数据的类型>( (数组中的每一项:项类型)=>{ return 你需要的数据 } )

代码演示:

//原对象数组
interface HeroInfo {
  id: number
  name: string
  title: string
}
const arr: HeroInfo[] = [
  { id: 105, name: '廉颇', title: '正义爆轰' },
  { id: 106, name: '小乔', title: '恋之微风' },
  { id: 107, name: '赵云', title: '苍天翔龙' },
  { id: 108, name: '墨子', title: '和平守望' },
]
//如果我们需要通过一个数组得到一个简单类型的新数组,map可以不需要显示指定泛型
let newarr = arr.map((item:HeroInfo)=>{
  return item.name
})
console.log(newarr.toString())//打印结果廉颇,小乔,赵云,墨子
console.log(JSON.stringify(newarr))//打印结果["廉颇","小乔","赵云","墨子"]
//如果返回的是一个复杂类型的数组,则必须通过interface来定义类型,并要在 map方法的return 后面返回符合这个接口类型的对象
interface nam{
  name:string
}
let Newarr = arr.map<nam>((item:HeroInfo)=>{
  return {name:item.name}
})
console.log(JSON.stringify(Newarr))//打印结果[{"name":"廉颇"},{"name":"小乔"},{"name":"赵云"},{"name":"墨子"}]

小案例:

// map 基本使用01-
// 需求:基于numArr返回新数组,每一个数组翻倍后返回一个新数组
const numArr: number[] = [1, 2, 3, 4, 5]

let numarr = numArr.map((item:number)=>{
  return item*2
})
console.log(numarr.toString())

// map 基本使用02
// 需求1. 基于 foodArr 返回新数组['西兰花','西葫芦','西红柿']
// 需求2. 基于 foodArr返回新数组
/*[
    {id:1,name:'西兰花',price:5},
    {id:2,name:'西葫芦',price:4},
    {id:3,name:'西红柿',price:3}
  ]
*/
interface FoodInfo {
  name: string
  price: number
}

const foodArr: FoodInfo[] = [
  {name:'西兰花',price:5},
  {name:'西葫芦',price:4},
  {name:'西红柿',price:3}
]
//需求1
let fooda = foodArr.map((item:FoodInfo)=>{
  return item.name
})
console.log(JSON.stringify(fooda))
 //需求2
interface food{
  id:number
  name:string
price:number
}
let foodarr = foodArr.map<food>((item:FoodInfo,index:number)=>{
  return {id:index+1,name:item.name,price:item.price}
})
console.log(JSON.stringify(foodarr))

1.5、filter 方法

作用:根据回调函数的执行结果,筛选出符合要求的元素,返回一个新数组。

语法:数组.filter((数组项:类型,索引:number)=>{

return true // 或者可以解析为 true 的值 需要这一项

return false // 或者可以解析为 false 的值 不需要这一项

})

代码演示:

//filter按需求获得一个新数组
let num = [34,66,75,47,99,59,80]
let num1 = num.filter((item)=>{
  return item>=60
})
console.log(num1.toString())//打印结果66,75,99,80

1.6、sort 方法

作用:sort方法对数组的元素进行排序,并返回对相同数组的引用。会改变原数组的内容排列顺序。

语法:数组.sort((第一个比较元素a,第二个比较元素b)=>{

return a-b如果是正数 // a 会调换到 b 的后面

return a-b如果是 负数 // a 会继续留在 b 的前面

return a-b如果是 0 // a和b的位置保持不变

//正序第一个参数减去第二个参数,倒序用第二个参数减去第一个参数

})

代码演示:

// 数值数组正序排序
const arr = [5, 12, 8, 130, 44]
arr.sort((a,b)=>{
  return a-b
})
console.log(arr.toString())

  // 对象数组排序 - 按照价格降序排列
interface Food{
  name:string
  price:number
}
const foods:Food[] = [
  {
    name: '西兰花',
    price: 6
  },
  {
    name: '西红柿',
    price: 3
  },
  {
    name: '榴莲',
    price: 30
  },
  {
    name: '葱花',
    price: 1
  }
]
foods.sort((a,b)=>{
  return a.price-b.price
})
console.log(JSON.stringify(foods))

1.7、reduce方法

作用:reduce方法的作用是求和,他会逐个遍历数组元素,每一步都将当前元素的值与前一步的结果相加,最后返回。

语法:数组.reduce((累加结果,当前元素值)=>{}, 初始值)

代码演示:

let arr = [1,2,3,4,5]
let Arr = arr.reduce((a,b)=>{
  return a + b
},0)
console.log(Arr.toString())

1.8、findindex

作用:

语法:

代码演示:

let arr = [1,2,3,4,5]
let arr1 = arr.findIndex((item:number)=>{
  return item == 4
})
console.log(arr1.toString())

1.9、find方法

作用:find() 方法返回通过测试(函数内判断)的数组的第一个元素的值,找不到返回 undefined。

语法:数组.find((数组项:类型,索引:number)=>{

return true // 找到了需要的元素

return false // 或者可以解析为 false 的值 不是这一项

})

代码演示:

interface Good{
  id:number
  name:string
  price:number
  color:ResourceColor
}
const goods:Good[]= [
  {
    id: 1,
    name: "苹果",
    price: 2.5,
    color: Color.Red// 红色
  },
  {
    id: 2,
    name: "香蕉",
    price: 1.8,
    color: Color.Yellow// 黄色
  },
  {
    id: 3,
    name: "蓝莓",
    price: 3.0,
    color: Color.Blue// 蓝色
  },
  {
    id: 4,
    name: "草莓",
    price: 4.5,
    color: Color.Pink// 粉红色
  },
  {
    id: 5,
    name: "橙子",
    price: 2.0,
    color: Color.Orange// 橙色
  },
  {
    id: 6,
    name: "李子",
    price: 1.2,
    color: Color.Green// 黄色
  }
];

// 2.1 找出 名字叫做 橙子 的水果
let czname = goods.find((item:Good)=>{
  return item.name == '橙子'
})
console.log(JSON.stringify(czname))
// 2.2 找出价格大于等于 3 元的第一个水果
let pr = goods.find((item:Good)=>{
  return item.price == 3
})
console.log(JSON.stringify(pr))
// 2.3 找出粉色的水果
let pin = goods.find((item:Good)=>{
  return item.color == Color.Pink
})
console.log(JSON.stringify(pin))

1.11、 every 方法

作用:every 方法测试一个数组内的【所有元素】是否都能通过指定函数的测试。它返回一个布尔值true/false。

语法:const res = 数组.every((数组项:类型,索引:number)=>{

return true // 当前元素符合要求 返回 true

return false // 当前元素不符合要求 返回 false

})

代码演示:

// 1. 数值数组 判断是否每个元素都大于 2
const numArr = [2,4,6,8,10]
let num = numArr.every((item)=>{
  return item > 2
})
console.log(JSON.stringify(num))

案例:

interface Animal{
  id:number
  name:string
  color:ResourceColor // 颜色
  diet:string // 饮食习性
}

const animals:Animal[] = [
  {
    id:1,
    name:'狮子',
    color:Color.Yellow,
    diet:'肉食动物'
  },
  {
    id:2,
    name:'老虎',
    color:Color.Yellow,
    diet:'肉食动物'
  },
  {
    id:3,
    name:'黄鼠狼',
    color:Color.Yellow,
    diet:'肉食动物'
  },
  {
    id:4,
    name:'柴犬',
    color:Color.Yellow,
    diet:'杂食动物'
  },

]

// 3.1 判断是否每个动物的颜色都是黄色
let an = animals.every((item)=>{
  return item.color == Color.Yellow
})
console.log(JSON.stringify(an))

1.12、some 方法

作用:some 方法测试数组中是否【至少有一个元素】通过了由提供的函数实现的测试。

语法:const res = 数组.every((数组项:类型,索引:number)=>{

return true // 当前元素符合要求 返回 true

return false // 当前元素不符合要求 返回 false

})

代码演示:

// 1. 数值数组 判断是否有等于 5 的元素
const numList = [2, 4, 6, 8, 10]
let n = numList.some((item)=>{
  return item == 5
})
console.log('',n) 

二、函数补充

2.1、回调函数

概念:作为实参传入另一个函数,并在该函数内被调用,用来完成某些任务的函数,称之为回调函数

比如:

image.png

2.2、 箭头函数化简

箭头函数在日常使用中,如果满足一些特定的条件,可以写的更为简洁。

简写条件:

  1. 函数体只有一行,可以省略大括号
  1. 省略大括号时,如果有 return,也需要一起省略
  1. 参数只有一个,且不需要写类型,可以省略小括号

image.png