Array 对象是用于构造数组的全局对象,数组是类似列表的高阶对象。

Array.from()

从一个类似数组或可迭代对象中创建一个新的数组实例。

  1. // 语法
  2. Array.from(arrayLike[, mapFn[, thisArg]])
  3. // arraylike 想要转换成数组的伪数组对象和可迭代对象
  4. // mapFn 如果指定了该参数,新数组中的每个元素会指定返回调函数
  5. // thisArg 执行回调函数 mapFn 时 this 对象
  6. // 返回值 一个新的数组实例
  1. Array.from('foo') // ['f', 'o', 'o']
  2. let s = new Set(['foo', window])
  3. Array.from(s) // ['foo', window]
  4. let m = new Map([[1, 2], [2, 4], [4, 8]])
  5. Array.from(m) // [[1, 2], [2, 4], [4, 8]]
  6. function f() {
  7. return Array.from(arguments)
  8. }
  9. f(1, 2, 3) // [1, 2, 3]
  10. Array.from([1, 2, 3], x => x + x) // [2, 4, 6]
  11. Array.from({length: 5}, (v, i) => i) // [0, 1, 2, 3, 4]
  12. // 数组去重合并
  13. function combine() {
  14. let arr = [].concat.apply([], arguments)
  15. return Array.from(new Set(arr))
  16. }
  17. let m = [1, 2, 2]
  18. let n = [2, 3, 3]
  19. combine(m, n) //[1, 2, 3]

Array.isArray()

用于确定传递的值是否是一个Array

  1. // 语法
  2. Array.isArray(obj)
  3. Array.isArray([1, 2, 3]) // true
  4. Array.isArray({foo: 123}) // false
  5. Array.isArray("foobar") // false
  6. Array.isArray(undefined) // false

Array.of()

用于创建一个具有可变数量参数的新数组实例,而不考虑参数的数量和类型。

  1. Array.of(7) // [7]
  2. Array.of(1, 2, 3) // [1, 2, 3]
  3. Array.of(undefined) // [undefined]
  4. Array(7) // [ , , , , , , , ]
  5. Array(1, 2, 3) // [1, 2, 3]
  6. Array(undefined) // [undefined]

Array.prototype.concat()

用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

  1. var new_array = old_array.concat(vaue1[, value2[, ...[, valueN]]])
  2. // 返回一个新的 Array 实例
  1. var alpha = ['a', 'b', 'c']
  2. var numeric = [1, 2, 3]
  3. alpha.concat(numeric) // ['a', 'b', 'c', 1, 2, 3]
  4. let num1 = [1, 2],
  5. num2 = [3, 4],
  6. num3 = [5, 6];
  7. var nums = num1.concat(num2, num3); // nums [1, 2, 3, 4, 5, 6]
  8. let alhpa = ['a', 'b', 'c'];
  9. let alphaNum = alpha.concat(1, [2, 3]); // alphaNum ['a', 'b', 'c', 1, 2, 3]
  10. // 合并嵌套数组
  11. let num1 = [[1]]
  12. let num2 = [2, [3]]
  13. let nums = num1.concat(num2) // nums [[1], 2, [3]]
  14. num1[0].push(4) // nums [[1, 4], 2, [3]]

Array.prototype.copyWithin()

浅复制数组的一部分到同一数组中的另一个位置,并返回它,而不修改其大小

  1. arr.copyWitnin(target[, start[, end]])
  2. // 返回改变后的数组
  3. let numbers = [1, 2, 3, 4, 5]
  4. numbers.copyWithin(-2) // [1, 2, 3, 1, 2]
  5. numberss.copyWithin(0, 3, 4) // [4, 2, 3, 4, 5]

Array.prototype.entries()

返回一个新的 Array iterator 对象,该对象包含数组中每个索引的键/值对。

  1. var arr = ['a', 'b', 'c']
  2. var iterator = arr.entries()
  3. // iterator.next 方法运行
  4. var a = []
  5. for (var i=0; i<arr.length+1; i++) {
  6. var tem = iterator.next()
  7. if (tem.done !== true) {
  8. a[i]=tem.value
  9. }
  10. }
  11. // a [[0, 'a'], [1, 'b'], [2, 'c']]
  12. // 二维数组按行排序
  13. function sortArr(arr) {
  14. var goNext = true
  15. var entries = arr.entries()
  16. while(goNext) {
  17. var result = entries.next()
  18. if (result.done !== true) {
  19. result.value[1].sort((a, b) => a - b)
  20. goNext = true
  21. } else {
  22. goNext = false
  23. }
  24. }
  25. return arr;
  26. }
  27. var arr = [[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]];
  28. sortArr(arr); // [[1, 34], [2, 3, 44, 234, 456], [1, 4, 5, 6, 4567]]
  29. // 使用 for...of 循环
  30. for (let e of iterator) {
  31. console.log(e)
  32. }
  33. // [0, "a"]
  34. // [1, "b"]
  35. // [2, "c"]

Array.prototye.every()

测试数组的所有元素是否都通过了指定函数的测试。
所有元素都符合条件才返回true;空数组也返回 true.

  1. function isBigEnough(element, index, array) {
  2. return (element >= 10)
  3. }
  4. var passed = [12, 5, 8, 130, 44].every(isBigEnough) // false
  5. var passed2 = [12, 54, 18, 130, 44].every(isBigEnough) // true

Array.prototype.fill()

用一个固定值填充一个数组从其实索引到终止索引内的全部元素。不包括终止索引。

  1. arr.fill(value[, start[, end]])
  2. [1, 2, 3].fill(4) // [4, 4, 4]
  3. [1, 2, 3].fill(4, 1) // [1, 4, 4]
  4. [1, 2, 3].fill(4, 1, 2) // [1, 4, 3]
  5. [1, 2, 3].fill(4, 1, 1) // [1, 2, 3]
  6. [1, 2, 3].fill(4, 3, 3) // [1, 2, 3]
  7. [1, 2, 3].fill(4, -3, -2) // [4, 2, 3]
  8. [1, 2, 3].fill(4, NaN, NaN) // [1, 2, 3]
  9. [1, 2, 3].fill(4, 3, 5) // [1, 2, 3]
  10. Array(3).fill(4) // [4, 4, 4]
  11. [].fill.call({ length: 3 }, 4) // {0: 4, 1: 4, 2: 4}

Array.prototype.filter()

创建一个新数组,其包含通过所提供函数实现的测试的所有元素

  1. // > 10
  2. function isBigEnough(element) {
  3. return element > 10
  4. }
  5. var filtered = [12, 5, 8, 130].filter(isBigEnough) // [12, 130]
  6. // 过滤Json中无效条目
  7. var arr = [
  8. { id: 15 },
  9. { id: -1 },
  10. { id: 0 },
  11. { id: 3 },
  12. { id: 12.2 },
  13. { },
  14. { id: null },
  15. { id: NaN },
  16. { id: 'undefined' }
  17. ];
  18. function isNumber(obj) {
  19. return obj !== undefined && typeof(obj) === 'number' && !isNaN(obj)
  20. }
  21. function filterById(item) {
  22. if (isNumber(item.id) && item.id !== 0) {
  23. return true
  24. }
  25. }
  26. var arrById = arr.filter(filterById) // [{id: 15}, {id: -1}, {id: 3}, {id: 12.2}]
  27. // es6
  28. const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];
  29. const filterItems = (query) => {
  30. return fruits.filter(el => el.toLowerCase().indexOf(query.toLowerCase()) > -1)
  31. }
  32. filterItems('ap') // ['apple', 'grapes']
  33. filterItems('an') // ['banana', 'mango', 'orange']

Array.prototype.find()

返回数组中满足条件的第一个元素的值,没有就返回 undefined.

// 用对象的属性查找数组里的对象

  1. var inventory = [
  2. {name: 'apples', quantity: 2},
  3. {name: 'banans', quantity: 0},
  4. {name: 'cherries', quantity: 5}
  5. ]
  6. inventory.find(v => v.name === 'cherries') // {name: 'cherries', quantity: 5}

当在回调函数中删除数组中的一个值时,当访问这个位置时,返回 undefined.

  1. var a = [0, 1,,,4, 5]
  2. a.find(function(value, index) {
  3. if (index === 0) {
  4. delete a[4]; // 将a[4]设置为undefined
  5. a.pop(); // 在find()仍能访问到最后一项
  6. }
  7. console.log(`index: ${index}; value: ${value}`)
  8. })

Array.prototype.findIndex()

返回数组中满足条件的第一个元素的索引,否则返回 -1

  1. arr.findIndex(callback[, thisArg])
  2. // callbak 自动传入三个参数
  3. element 当前元素
  4. index 当前元素索引
  5. array 调用findIndex 的数组

查找数组中首个质数元素的索引

  1. function isPrime(element, index, array) {
  2. var start = 2;
  3. while(start <= Math.sqrt(element)) {
  4. if (element % start++ < 1) {
  5. return false
  6. }
  7. }
  8. return element > 1
  9. }
  10. console.log([4, 6, 8, 12].findIndex(isPrmise)) // -1
  11. console.log([4, 6, 7, 12].findIndex(isPrmise)) // 2

Array.prototoype.flat()

这是个实验中的功能,需要考虑浏览器的兼容性
flat() 用于递归到指定深度将所有子数组连接,并返回一个新数组.

  1. var newArray = arr.flat(depth) // depth 指定嵌套数组中的结构深度, 默认为1

扁平化嵌套数组

  1. var arr1 = [1, 2, [3, 4]]
  2. arr1.flat() // [1, 2, 3, 4]
  3. var arr2 = [1, 2, [3, 4, [5, 6]]]
  4. arr2.flat() // [1, 2, 3, 4, [5, 6]]
  5. var arr2 = [1, 2, [3, 4, [5, 6]]]
  6. arr2.flat(2) // [1, 2, 3, 4, 5, 6]
  7. // Infinity 展开所有嵌套数组
  8. var arr3 = [1, 2, [3, 4, [5, 6]]]
  9. arr3.flat(Infinity) // [1, 2, 3, 4, 5, 6]

扁平化与空项(flat() 会移除数组中的空项)

  1. var arr4 = [1, 2, , 4, 5]
  2. arr4.flat() // [1, 2, 4, 5]

Array.prototype.flatMap()

这是一个实验中的方法,尽量不要在生产环境中使用它。
flatMap() 首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。

将包含几句话的数组拆分成到哪儿汉字组成的新数组。

  1. let arr = ['今天天气不错', '', '早上好']
  2. arr.map(s => s.split("")) // [["今", "天", "天", "气", "不", "错"],[""],["早", "上", "好"]]
  3. arr.flatMap(s => s.split('')) // ["今", "天", "天", "气", "不", "错", "早", "上", "好"]

Array.prototyp.forEach()

forEach() 对数组的每个元素执行一个提供的函数。
返回值: undefined
没有办法中止或跳出forEach() 循环,除了抛出一个异常。

打印数组的内容

  1. function logArrayElements(element, index, array) {
  2. console.log('a['+ index +'] = ' + element)
  3. }
  4. // 索引2被跳过了,因为数组中的这个位置没有项
  5. [2, 5, , 9].forEach(logArrayElements)

如果数组在迭代时被修改了,则其它元素会被跳过

  1. var words = ['one', 'two', 'three', 'four']
  2. words.forEach(function(word) {
  3. console.log(word)
  4. if (word === 'two') {
  5. words.shift();
  6. }
  7. })
  8. // 输出 one two four
  9. // words ['two', 'three', 'four']

当达到tow 项时,整个数组的第一项被移除了,导致所有剩下的项上移一个位置。因为元素four 限制在数组跟前的位置, three 会被跳过

扁平化数组

  1. function flatten(array) {
  2. let result = [];
  3. array.forEach(v => {
  4. if (Array.isArray(v)) {
  5. result.push(...flatten[i])
  6. } else {
  7. result.push(i)
  8. }
  9. })
  10. return result;
  11. }

Array.prototype.includes()

用来判断一个数组是否包含一个指定的值,如果包含返回true,否则false.

  1. arr.includes(valueToFind[, fromIndex])
  2. // valueToFind 需要查找的元素值
  3. // fromIndex 从该索引处开始查找,如果是负值,则按升序从 array.length - fromIndex 的索引开始搜。默认0
  4. // 返回值 Boolean

示例

  1. [1, 2, 3].includes(3, 3) // false
  2. [1, 2, 3].includes(3, -1) // true
  3. [1, 2, NaN].includes(NaN) // true

fromIndex 大于等于数组的长度,则会返回false, 且该数组不会被搜索。

  1. var arr = ['a', 'b', 'c']
  2. arr.includes('c', 3) // false
  3. arr.includes('c', 100) // false

如果fromIndex 为负值,计算出的索引将作为开始搜索的位置。如果计算出的索引小于0,则整个数组都会被搜索。

  1. var arr = ['a', 'b', 'c']
  2. arr.includes('a', -100); // true
  3. arr.includes('b', -100); // true
  4. arr.includes('a', -2); // false

Array.prototype.indexOf()

返回在数组中可以找到的给定元素的第一个索引,如果不存在,则返回 -1.

判断一个元素是否在数组里,不在则更新数组。

  1. function updateVegetablesCollection(veggies, veggie) {
  2. if (veggies.indexOf(veggie) === -1) {
  3. veggies.push(veggie)
  4. } else if ( veggies.indexOf(veggie) > -1) {
  5. console.log(veggie + 'already exists in the veggies collection.')
  6. }
  7. }
  8. var veggies = ['potato', 'tomato']
  9. updateVegetablesCollection(veggies, 'spinach') // ['patato', 'tomato', 'spinach']

Array.prototype.join()

join() 将一个数组(或类数组对象)的所有元素连接成一个字符串并返回这个字符串。
如果数组只有一个项目,那么将返回该项目而不使用分隔符。

  1. arr.join([spearator])
  2. // spearator 默认为‘,’.如果spearator是空字符串(""),则所有元素之间都没够任何字符。
  3. 返回值: 一个所有数组元素连接的字符串。如果arr.length 0,则返回空字符串。
  4. 如果一个元素为 undefined null, 它会被转换成空字符。

示例

  1. var a ['Wind', 'Rain', 'Fire']
  2. var myVal1 = a.join(); // "Wind,Rain,Fire"
  3. var myVal2 = a.join(", ") // "Wind, Rain, Fire"
  4. var myVal3 = a.join(" + ") // "Wind + Rain + Fire"
  5. var myVal4 = a.join('') // "WindRainFire"

Array.prototype.keys()

key() 返回一个包含数组中每个索引键的 Array Iterator 对象

返回值: 一个新的 Array 迭代器对象

索引迭代器会包含那些没有对应元素的索引。

  1. var arr = ['a', 'c']
  2. var sparsekeys = Object.keys(arr); // ['0', '1']
  3. var denseKeyss = [...arr.keys()]; // [0, 1]

Array.prototype.lastIndexOf()

返回指定元素再数组中的最后一个索引,如果不存在则返回 -1. 从数组的后面向前查找,从 fromIndex 开始。

Array.prototype.map()

map() 创建一个新数组。
返回值: 一个新数组,每个元素都是回调函数的结果

数组中每个元素的平方根

  1. let numbers = [1, 4, 9]
  2. var roots = numbers.map(Math.sqrt)
  3. // roots [1, 2, 3]
  4. // numbers = [1, 4, 9]

使用技巧

  1. ['1', '2', '3'].map(parseInt) // [1, NaN, NaN]
  2. ['1', '2', '3'].map(str => parseInt(str)) // [1, 2, 3]
  3. ['1', '2', '3'].map(Number) // [1, 2, 3]
  4. ['1.1', '2.2e2', '3e300'].map(Number) // [1.1, 220, 3e+300]