当前位置: 首页 > news >正文

数据结构与算法-数组(Array)

Javascript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。但是,这些数字索引在内部被转换为字符串类型,这是因为Javascript对象中的属性名必须是字符串。数组在javascript中只是一种特殊的对象,所以效率上不如其它语言中的数组高。

javascript中的数组,严格来说应该称为对象,是特殊的javascript对象,在内部被归类未数组。由于Array在javascript中被当做对象,因此它有许多属性和方法可以在编程时使用。

1、创建数组

  1. var number = [];

// number.length = 0; 效率最高,推荐使用

  1. var number = [1, 2, 3, 4, 5];

// number.length = 5

  1. var number = new Array();

// number.length = 0

  1. var number = new Array(1, 2, 3, 4, 5);

// number.length = 5

  1. var number = new Array(10);

// number.length = 10

  1. var objects = [1, 'wqh', false, null];

// 数组中的元素不必是同一种数据类型,这一点和很多编程语言不同。

2、判断数组-Array.isArray()

Array.isArray()判断一个对象是否是数组。

var number = 10;
var arr = [7, 8, 9];
Array.isArray(number); // false
Array.isArray(arr); // true
复制代码

3、读写数组

使用[]操作符将数据赋值给数组

var nums = []
for (var i = 0; i < 10; i++) {
    nums[i] = i;
}
复制代码

使用[]操作符读取数组中的元素

var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for (var i = 0; i < nums.length; i++) {
    console.log(nums[i])
}
复制代码

4、字符串生成数组-split()

调用字符串对象的split()方法。

var paragraph = 'my name is wuQinHao'
var wordsArray = paragraph.split(' ')
console.log(wordsArray)
// ["my", "name", "is", "wuQinHao"]
复制代码

5、浅复制与深复制

var nums = [1, 2, 3, 4, 5]
var copyNums = nums
console.log(copyNums) // [1, 2, 3, 4, 5]
nums[0] = 100
console.log(copyNums[0]) // 100
复制代码

由此可见把一个数组赋值给另一个数组时,只是为被赋值的数组增加了一个新的引用,当改变原引用的数值时新引用也会随之改变,这是浅复制

var nums = [1, 2, 3, 4, 5]
var copyNums = []
for (var i = 0; i < nums.length; i++) {
    copyNums[i] = nums[i]
}
console.log(copyNums) // [1, 2, 3, 4, 5]
nums[0] = 100
console.log(copyNums[0]) // 1
复制代码

将原数组中的每一个元素都复制到新数组中,这是深复制。

6、查找元素-indexOf()

indexof用来查找传进来的参数在目标数组中是否存在。如果目标数组包含该参数,就返回该元素在数组中的索引,如果不包含,就返回-1

var names = ['www', 'qqq', 'hhh']
var isHave = names.indexOf('hhh')
var noHave = names.indexOf('w')
console.log(isHave) // 2
console.log(noHave) // -1
复制代码

7、数组转为字符串-join(),toString()

var names = ['wu', 'qin', 'hao', 1, true, null, undefined]
var nameString1 = names.join()
var nameString2 = names.toString()
console.log(nameString1)
console.log(nameString2)
// wu,qin,hao,1,true, , 
// wu,qin,hao,1,true, , 
复制代码

8、合并多个数组创建一个新数组-concat()

var arr1 = ['wu', 'qin', 'hao']
var arr2 = [1, 2, 3]
var arrConcat1 = arr1.concat(arr2)
var arrConcat2 = arr2.concat(arr1)
console.log(arrConcat1) // ["wu", "qin", "hao", 1, 2, 3]
console.log(arrConcat2) // [1, 2, 3, "wu", "qin", "hao"]
复制代码

9、截取一个数组的子集创建一个新数组-splice()

splice()方法从现有数组里截取一个新数组,该方法的第一个参数是截取的起始索引,第二个参数是截取的长度。

var arr1 = ['wu', 'qin', 'hao', 1, 2, 3]
var arr2 = arr1.splice(0, 3)
console.log(arr2) // ["wu", "qin", "hao"]
复制代码

10、数组操作

push() // 末尾添加元素
unshift() // 开头添加元素 
pop() // 末尾删除元素
shift() // 开头删除元素
splice() // 中间位置添加和删除元素
reverse() // 数组元素顺序颠倒排序
sort() // 按照字典顺序对字符串数组排序
复制代码

11、迭代器方法

迭代器就是对数组中的每个元素应用一个函数,可以返回一个值,一组值,或一个新数组

一、不生成新数组的迭代器方法

1.forEach()

接受一个函数作为参数,对数组中的每个元素使用该函数,没有返回值。

var nums = [1, 2, 3, 4, 5]
nums.forEach((item) => {
    var a = item * item
    console.log(a)
})
// 1 4 9 16 25
复制代码

2.every()

接受一个返回值为Boolean类型的函数,对数组中的每个元素使用该函数,如果对于所有的元素,改函数均返回true, 则该方法返回true。

var nums = [1, 2, 3, 4, 5]
var even = nums.every((item) => {
    return item % 2 === 0
})
console.log(even) // false

var nums2 = [2, 2, 2, 2, 2]
var even2 = nums2.every((item) => {
    return item % 2 === 0
})
console.log(even2) // true
复制代码

3.some()

接受一个返回值为Boolean类型的函数,只要有一个元素使得该函数返回true,则该方法就返回true。

var nums = [1, 2, 3, 4, 5]
var someEven = nums.some((item) => {
    return item % 2 === 0
})
console.log(someEven) // true
复制代码

4.reduce()

接受一个函数,返回一个值

var nums = [1, 2, 3, 4, 5]
var sum = nums.reduce((total, current) => {
    return total + current
})
console.log(sum) // 15

var words = ['my', 'name', 'is', 'wuqinhao']
var sentence = words.reduce((total, current) => {
    return total + current
})
console.log(sentence) // mynameiswuqinhao
复制代码

5.reduceRight()

与reduce不同,从右到左执行

var words = ['my', 'name', 'is', 'wuqinhao']
var sentence = words.reduceRight((total, current) => {
    return total + current
})
console.log(sentence) // wuqinhaoisnamemy
复制代码

二、生成新数组的迭代器方法

1.map()

map() 和 forEach()有点像,对数组中的每个元素使用某个函数。map返回一个新数组。

var nums = [1, 2, 3, 4, 5]
var numsChange = nums.map((item) => {
    return item * item
})
console.log(numsChange)
复制代码

2.filter()

filter() 和 every()有点像,传入一个返回值为Boolean类型的函数,不同点是当对数组中的所有元素应用该函数,该方法并不返回true,而是返回一个新数组,该数组包含应用该函数后结果为true的元素。

var words = ['wqh', 'www', 'qqq', 'hhh']
let filterWord = words.filter((item) => {
    if (item.indexOf('ww') > -1) {
        return true
    }
    return false
})
console.log(filterWord)
复制代码

12、对象数组

数组可以包含对象,数组的方法和属性对对象依然适用

var array = [{x:1,y:1},{x:2,y:2},{x:3,y:3}]
复制代码

13.对象中的数组

在对象中,可以适用数组存储复杂的数据,

var obj = {
    x: 1,
    y: 2,
    array: [1, 2, 3, 4 ,5]
}
复制代码

转载于:https://juejin.im/post/5cd4ec136fb9a032050e5a90

相关文章:

  • Linux-01初级学习
  • Go语言中时间函数及定时器的使用
  • react——jsx源码解析
  • 拿Proxy可以做哪些有意思的事儿
  • centos7 安装 rabbitmq
  • 如何快速学习Java?
  • SylixOS write 0字节问题
  • 理解Android 中的启动模式
  • 深入理解jvm jdk1,7(5)
  • 学会python可以上天!20行代码获取斗鱼平台房间数据,就是这么牛逼!
  • Golang 多goroutine异步通知error的一种方法
  • 前端base64加密
  • 关于kettle,表输入postgres中有jsonb字段的处理
  • Mybatis架构设计及源码分析-mapper.xml文件解析
  • AGC005 补题小结
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Angularjs之国际化
  • CSS相对定位
  • echarts的各种常用效果展示
  • leetcode386. Lexicographical Numbers
  • oschina
  • rabbitmq延迟消息示例
  • sessionStorage和localStorage
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue:响应原理
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 从零开始的无人驾驶 1
  • 从伪并行的 Python 多线程说起
  • 大整数乘法-表格法
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 京东美团研发面经
  • 蓝海存储开关机注意事项总结
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前嗅ForeSpider中数据浏览界面介绍
  • 说说动画卡顿的解决方案
  • #ifdef 的技巧用法
  • #mysql 8.0 踩坑日记
  • $.ajax()方法详解
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言)strcpy函数用法
  • (Python第六天)文件处理
  • (备忘)Java Map 遍历
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (论文阅读40-45)图像描述1
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • ***详解账号泄露:全球约1亿用户已泄露
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET序列化 serializable,反序列化
  • .Net中的设计模式——Factory Method模式