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

910 阅读5分钟

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]
}