饥人谷技术博客

数据结构之数组

2019-03-21  本文已影响2人  YM雨蒙

数组

  1. 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构。
  1. 数组存储一系列同一种数据类型的值。但在JavaScript里,也可以在数组中保存不同类型的值。
  1. JavaScript 中的数组,严格来说应该称作对象,是特殊的 JavaScript 对象,在内部被归类为数组。
    由于 Array 在 JavaScript 中被当作对象,因此它有许多属性和方法可以在编程时使用。
  1. 数组的标准定义是:一个存储元素的线性集合(collection),元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。

创建数组

1. 通过[] 操作符声明一个数组变量

var array = []

array[0] = 1
array[1] = 2
...
  1. 在声明数组变量时,直接在 [] 操作符内放入一组元素
var array = [1, 2, 3, 4, 5]
  1. 可以调用 Array 的构造函数创建数组
var array = new Array()

var array = new Array(1, 3, 5, 7, 9)
  1. 在调用 Array 的构造函数时,可以只传入一个参数,用来指定数组的长度
var array = new Array(10)
array.length = 10
  1. 在脚本语言里很常见的一个特性是,数组中的元素不必是同一种数据类型,这一点和很多
    编程语言不同
var objects = [1, "Joe", true, null]
  1. 调用 Array.isArray() 来判断一个对象是否是数组
var arr = [1, 5, 9]
Array.isArray(arr)

使用数组

  1. 在一条赋值语句中,可以使用 [] 操作符将数据赋给数组
var nums = []
for (var i = 0; i < 100; i++ ) {
  nums[i] = i + 1
}
  1. 以使用 [] 操作符读取数组中的元素
var numbers = [1,2,3,4,5];
var sum = numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4];
  1. 字符串对象的 split()方法也可以生成数组
var sentence = "the quick brown fox jumped over the lazy dog";
var words = sentence.split(" ");
for (var i = 0; i < words.length; ++i) {
  console.log("word " + i + ": " + words[i]);
}

存取函数

JavaScript 提供了一组用来访问数组元素的函数,叫做存取函数,这些函数返回目标数组的某种变体。

  1. 查找元素
var array = [1, 3, 5, 7, 7, 9]
array.indexOf(1)  // 0
array.indexOf(5)  // 2
array.indexOf(2)  // -1

array.indexOf(7)  // 3
array.lastIndexOf(7)  // 4

// 数组去重
var arr = [1,2,2,3,4,5,5,6,7,8,7]
var newArr = []
for(var i = 0; i< arr.length; i++) {
  if (newArr.indexOf(arr[i]) < 0) {
    newArr.push(arr[i])
  }
}
console.log(newArr)  // [1, 2, 3, 4, 5, 6, 7, 8]
  1. 数组的字符串表示
var names = ["David", "Cynthia", "Raymond", "Clayton", "Mike", "Jennifer"]
console.log(names.join())  // "David,Cynthia,Raymond,Clayton,Mike,Jennifer"
console.log(names.toString())  // "David,Cynthia,Raymond,Clayton,Mike,Jennifer"
  1. 由已有数组创建新数组
var a = [1, 2, 5]
var b = [6, 9, 3]
console.log(a.concat(b))  // [1, 2, 5, 6, 9, 3]

var a = [1, 2, 5, 6, 9, 3]
console.log(a.splice(2,2))  // [5, 6]
console.log(a)  // [1, 2, 9, 3]

console.log(a.splice(2, 2, 12, 13, 15))
console.log(a)  // [1, 2, 12, 13, 15, 9, 3]

可变函数

  1. 为数组添加元素
var a = [1, 2, 3, 4]
a.push(6)
a.push(11, 13)
a  // [1, 2, 3, 4, 6]
a  // [1, 2, 3, 4, 6, 11, 13]
a.unshift(8)
a  // [8, 1, 2, 3, 4, 6]
  1. 从数组中删除元素
var b = [1, 3, 5, 7, 9]
b.pop()
b  // [1, 3, 5, 7]

b.shift()
b  // [3, 5, 7]
  1. 从数组中间位置添加和删除元素
var nums = [1,2,3,7,8,9]
nums.splice(3, 0, 4, 5, 6)
nums  //  [1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. 为数组排序
var nums = [1, 2, 3, 4, 5]
nums.reverse()
nums  // [5, 4, 3, 2, 1]
var names = ["David", "Mike", "Cynthia", "Clayton", "Bryan", "Raymond"]
names.sort()  // ["Bryan", "Clayton", "Cynthia", "David", "Mike", "Raymond"]

var nums = [3, 1, 2, 100, 4, 200]
nums.sort()  // [1, 100, 2, 200, 3, 4]

function compare(num1, num2) {
  return num1 - num2;
}
var nums = [3,1,2,100,4,200];
nums.sort(compare);  // [1, 2, 3, 4, 100, 200]

迭代器方法

  1. 不生成新数组的迭代器方法
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
nums.forEach( (item, index, array) => {
   console.log(item * 2)  // 2, 4, 6, 8 ...
})
// item 必须。当前元素的值
// index 可选。当前元素的索引值
// array 可选。当前元素属于的数组对象
var ages = [32, 33, 16, 40]
ages.every((item, index, array) => {
  return item >= 18  // false
})
// item 必须。当前元素的值
// index 可选。当前元素的索引值
// array 可选。当前元素属于的数组对象
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
nums.some((item, index, array) => {
    return item % 2 == 0
})
语法: 
arr.reduce(callback[, initialValue])

accumulator 累计器
currentValue 当前值
currentIndex 当前索引
array 数组

callback
  执行数组中每个值的函数,包含四个参数:
  accumulator :累计器累计回调的返回值; 它是上一次调用回调时返回的累积值或initialValue
  currentValue :数组中正在处理的元素
  currentIndex : 可选 | 数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则为1。
  array : 可选 | 调用reduce()的数组

initialValue : 可选 | 作为第一次调用 callback函数时的第一个参数的值。 
如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
 
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
nums.reduce((accumulator, currentValue, currentIndex, array) => {
  // Todo
}, initialValue)

nums.reduce((accumulator, currentValue, currentIndex, array) => {
  return accumulator + currentValue  // 55
}, 0)

nums.reduce((accumulator, currentValue, currentIndex, array) => {
  return accumulator + currentValue  // 65
}, 10)
  1. 生成新数组的迭代器方法
// item 必须。当前元素的值
// index 可选。当前元素的索引值
// array 可选。当前元素属于的数组对象

var grades = [77, 65, 81, 92, 83]
grades.map((item, index, array) => {
    return item + 5  // [82, 70, 86, 97, 88]
})
grades  // [77, 65, 81, 92, 83]
// item 必须。当前元素的值
// index 可选。当前元素的索引值
// array 可选。当前元素属于的数组对象

var num = [1, 2, 3, 4, 5, 6, 7, 8]
num.filter((item, index, array) => {
  return item % 2 == 0  // [2, 4, 6, 8]
})
num  // [1, 2, 3, 4, 5, 6, 7, 8]
上一篇 下一篇

猜你喜欢

热点阅读