- Array.from()
- Array.isArray()
- Array.of()
- Array.prototype.concat()
- Array.prototype.copyWithin()
- Array.prototype.entries()
- Array.prototye.every()
- Array.prototype.fill()
- Array.prototype.filter()
- Array.prototype.find()
- Array.prototype.findIndex()
- Array.prototoype.flat()
- Array.prototype.flatMap()
- Array.prototyp.forEach()
- Array.prototype.includes()
- Array.prototype.indexOf()
- Array.prototype.join()
- Array.prototype.keys()
- Array.prototype.lastIndexOf()
- Array.prototype.map()
Array 对象是用于构造数组的全局对象,数组是类似列表的高阶对象。
Array.from()
从一个类似数组或可迭代对象中创建一个新的数组实例。
// 语法Array.from(arrayLike[, mapFn[, thisArg]])// arraylike 想要转换成数组的伪数组对象和可迭代对象// mapFn 如果指定了该参数,新数组中的每个元素会指定返回调函数// thisArg 执行回调函数 mapFn 时 this 对象// 返回值 一个新的数组实例
Array.from('foo') // ['f', 'o', 'o']let s = new Set(['foo', window])Array.from(s) // ['foo', window]let m = new Map([[1, 2], [2, 4], [4, 8]])Array.from(m) // [[1, 2], [2, 4], [4, 8]]function f() {return Array.from(arguments)}f(1, 2, 3) // [1, 2, 3]Array.from([1, 2, 3], x => x + x) // [2, 4, 6]Array.from({length: 5}, (v, i) => i) // [0, 1, 2, 3, 4]// 数组去重合并function combine() {let arr = [].concat.apply([], arguments)return Array.from(new Set(arr))}let m = [1, 2, 2]let n = [2, 3, 3]combine(m, n) //[1, 2, 3]
Array.isArray()
用于确定传递的值是否是一个Array
// 语法Array.isArray(obj)Array.isArray([1, 2, 3]) // trueArray.isArray({foo: 123}) // falseArray.isArray("foobar") // falseArray.isArray(undefined) // false
Array.of()
用于创建一个具有可变数量参数的新数组实例,而不考虑参数的数量和类型。
Array.of(7) // [7]Array.of(1, 2, 3) // [1, 2, 3]Array.of(undefined) // [undefined]Array(7) // [ , , , , , , , ]Array(1, 2, 3) // [1, 2, 3]Array(undefined) // [undefined]
Array.prototype.concat()
用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var new_array = old_array.concat(vaue1[, value2[, ...[, valueN]]])// 返回一个新的 Array 实例
var alpha = ['a', 'b', 'c']var numeric = [1, 2, 3]alpha.concat(numeric) // ['a', 'b', 'c', 1, 2, 3]let num1 = [1, 2],num2 = [3, 4],num3 = [5, 6];var nums = num1.concat(num2, num3); // nums [1, 2, 3, 4, 5, 6]let alhpa = ['a', 'b', 'c'];let alphaNum = alpha.concat(1, [2, 3]); // alphaNum ['a', 'b', 'c', 1, 2, 3]// 合并嵌套数组let num1 = [[1]]let num2 = [2, [3]]let nums = num1.concat(num2) // nums [[1], 2, [3]]num1[0].push(4) // nums [[1, 4], 2, [3]]
Array.prototype.copyWithin()
浅复制数组的一部分到同一数组中的另一个位置,并返回它,而不修改其大小。
arr.copyWitnin(target[, start[, end]])// 返回改变后的数组let numbers = [1, 2, 3, 4, 5]numbers.copyWithin(-2) // [1, 2, 3, 1, 2]numberss.copyWithin(0, 3, 4) // [4, 2, 3, 4, 5]
Array.prototype.entries()
返回一个新的 Array iterator 对象,该对象包含数组中每个索引的键/值对。
var arr = ['a', 'b', 'c']var iterator = arr.entries()// iterator.next 方法运行var a = []for (var i=0; i<arr.length+1; i++) {var tem = iterator.next()if (tem.done !== true) {a[i]=tem.value}}// a [[0, 'a'], [1, 'b'], [2, 'c']]// 二维数组按行排序function sortArr(arr) {var goNext = truevar entries = arr.entries()while(goNext) {var result = entries.next()if (result.done !== true) {result.value[1].sort((a, b) => a - b)goNext = true} else {goNext = false}}return arr;}var arr = [[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]];sortArr(arr); // [[1, 34], [2, 3, 44, 234, 456], [1, 4, 5, 6, 4567]]// 使用 for...of 循环for (let e of iterator) {console.log(e)}// [0, "a"]// [1, "b"]// [2, "c"]
Array.prototye.every()
测试数组的所有元素是否都通过了指定函数的测试。
所有元素都符合条件才返回true;空数组也返回 true.
function isBigEnough(element, index, array) {return (element >= 10)}var passed = [12, 5, 8, 130, 44].every(isBigEnough) // falsevar passed2 = [12, 54, 18, 130, 44].every(isBigEnough) // true
Array.prototype.fill()
用一个固定值填充一个数组从其实索引到终止索引内的全部元素。不包括终止索引。
arr.fill(value[, start[, end]])[1, 2, 3].fill(4) // [4, 4, 4][1, 2, 3].fill(4, 1) // [1, 4, 4][1, 2, 3].fill(4, 1, 2) // [1, 4, 3][1, 2, 3].fill(4, 1, 1) // [1, 2, 3][1, 2, 3].fill(4, 3, 3) // [1, 2, 3][1, 2, 3].fill(4, -3, -2) // [4, 2, 3][1, 2, 3].fill(4, NaN, NaN) // [1, 2, 3][1, 2, 3].fill(4, 3, 5) // [1, 2, 3]Array(3).fill(4) // [4, 4, 4][].fill.call({ length: 3 }, 4) // {0: 4, 1: 4, 2: 4}
Array.prototype.filter()
创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
// > 10function isBigEnough(element) {return element > 10}var filtered = [12, 5, 8, 130].filter(isBigEnough) // [12, 130]// 过滤Json中无效条目var arr = [{ id: 15 },{ id: -1 },{ id: 0 },{ id: 3 },{ id: 12.2 },{ },{ id: null },{ id: NaN },{ id: 'undefined' }];function isNumber(obj) {return obj !== undefined && typeof(obj) === 'number' && !isNaN(obj)}function filterById(item) {if (isNumber(item.id) && item.id !== 0) {return true}}var arrById = arr.filter(filterById) // [{id: 15}, {id: -1}, {id: 3}, {id: 12.2}]// es6const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];const filterItems = (query) => {return fruits.filter(el => el.toLowerCase().indexOf(query.toLowerCase()) > -1)}filterItems('ap') // ['apple', 'grapes']filterItems('an') // ['banana', 'mango', 'orange']
Array.prototype.find()
返回数组中满足条件的第一个元素的值,没有就返回 undefined.
// 用对象的属性查找数组里的对象
var inventory = [{name: 'apples', quantity: 2},{name: 'banans', quantity: 0},{name: 'cherries', quantity: 5}]inventory.find(v => v.name === 'cherries') // {name: 'cherries', quantity: 5}
当在回调函数中删除数组中的一个值时,当访问这个位置时,返回 undefined.
var a = [0, 1,,,4, 5]a.find(function(value, index) {if (index === 0) {delete a[4]; // 将a[4]设置为undefineda.pop(); // 在find()仍能访问到最后一项}console.log(`index: ${index}; value: ${value}`)})
Array.prototype.findIndex()
返回数组中满足条件的第一个元素的索引,否则返回 -1
arr.findIndex(callback[, thisArg])// callbak 自动传入三个参数element 当前元素index 当前元素索引array 调用findIndex 的数组
查找数组中首个质数元素的索引
function isPrime(element, index, array) {var start = 2;while(start <= Math.sqrt(element)) {if (element % start++ < 1) {return false}}return element > 1}console.log([4, 6, 8, 12].findIndex(isPrmise)) // -1console.log([4, 6, 7, 12].findIndex(isPrmise)) // 2
Array.prototoype.flat()
这是个实验中的功能,需要考虑浏览器的兼容性
flat() 用于递归到指定深度将所有子数组连接,并返回一个新数组.
var newArray = arr.flat(depth) // depth 指定嵌套数组中的结构深度, 默认为1
扁平化嵌套数组
var arr1 = [1, 2, [3, 4]]arr1.flat() // [1, 2, 3, 4]var arr2 = [1, 2, [3, 4, [5, 6]]]arr2.flat() // [1, 2, 3, 4, [5, 6]]var arr2 = [1, 2, [3, 4, [5, 6]]]arr2.flat(2) // [1, 2, 3, 4, 5, 6]// Infinity 展开所有嵌套数组var arr3 = [1, 2, [3, 4, [5, 6]]]arr3.flat(Infinity) // [1, 2, 3, 4, 5, 6]
扁平化与空项(flat() 会移除数组中的空项)
var arr4 = [1, 2, , 4, 5]arr4.flat() // [1, 2, 4, 5]
Array.prototype.flatMap()
这是一个实验中的方法,尽量不要在生产环境中使用它。
flatMap() 首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。
将包含几句话的数组拆分成到哪儿汉字组成的新数组。
let arr = ['今天天气不错', '', '早上好']arr.map(s => s.split("")) // [["今", "天", "天", "气", "不", "错"],[""],["早", "上", "好"]]arr.flatMap(s => s.split('')) // ["今", "天", "天", "气", "不", "错", "早", "上", "好"]
Array.prototyp.forEach()
forEach() 对数组的每个元素执行一个提供的函数。
返回值: undefined
没有办法中止或跳出forEach() 循环,除了抛出一个异常。
打印数组的内容
function logArrayElements(element, index, array) {console.log('a['+ index +'] = ' + element)}// 索引2被跳过了,因为数组中的这个位置没有项[2, 5, , 9].forEach(logArrayElements)
如果数组在迭代时被修改了,则其它元素会被跳过
var words = ['one', 'two', 'three', 'four']words.forEach(function(word) {console.log(word)if (word === 'two') {words.shift();}})// 输出 one two four// words ['two', 'three', 'four']
当达到tow 项时,整个数组的第一项被移除了,导致所有剩下的项上移一个位置。因为元素four 限制在数组跟前的位置, three 会被跳过
扁平化数组
function flatten(array) {let result = [];array.forEach(v => {if (Array.isArray(v)) {result.push(...flatten[i])} else {result.push(i)}})return result;}
Array.prototype.includes()
用来判断一个数组是否包含一个指定的值,如果包含返回true,否则false.
arr.includes(valueToFind[, fromIndex])// valueToFind 需要查找的元素值// fromIndex 从该索引处开始查找,如果是负值,则按升序从 array.length - fromIndex 的索引开始搜。默认0// 返回值 Boolean
示例
[1, 2, 3].includes(3, 3) // false[1, 2, 3].includes(3, -1) // true[1, 2, NaN].includes(NaN) // true
fromIndex 大于等于数组的长度,则会返回false, 且该数组不会被搜索。
var arr = ['a', 'b', 'c']arr.includes('c', 3) // falsearr.includes('c', 100) // false
如果fromIndex 为负值,计算出的索引将作为开始搜索的位置。如果计算出的索引小于0,则整个数组都会被搜索。
var arr = ['a', 'b', 'c']arr.includes('a', -100); // truearr.includes('b', -100); // truearr.includes('a', -2); // false
Array.prototype.indexOf()
返回在数组中可以找到的给定元素的第一个索引,如果不存在,则返回 -1.
判断一个元素是否在数组里,不在则更新数组。
function updateVegetablesCollection(veggies, veggie) {if (veggies.indexOf(veggie) === -1) {veggies.push(veggie)} else if ( veggies.indexOf(veggie) > -1) {console.log(veggie + 'already exists in the veggies collection.')}}var veggies = ['potato', 'tomato']updateVegetablesCollection(veggies, 'spinach') // ['patato', 'tomato', 'spinach']
Array.prototype.join()
join() 将一个数组(或类数组对象)的所有元素连接成一个字符串并返回这个字符串。
如果数组只有一个项目,那么将返回该项目而不使用分隔符。
arr.join([spearator])// spearator 默认为‘,’.如果spearator是空字符串(""),则所有元素之间都没够任何字符。返回值: 一个所有数组元素连接的字符串。如果arr.length 为 0,则返回空字符串。如果一个元素为 undefined 或 null, 它会被转换成空字符。
示例
var a ['Wind', 'Rain', 'Fire']var myVal1 = a.join(); // "Wind,Rain,Fire"var myVal2 = a.join(", ") // "Wind, Rain, Fire"var myVal3 = a.join(" + ") // "Wind + Rain + Fire"var myVal4 = a.join('') // "WindRainFire"
Array.prototype.keys()
key() 返回一个包含数组中每个索引键的 Array Iterator 对象
返回值: 一个新的 Array 迭代器对象
索引迭代器会包含那些没有对应元素的索引。
var arr = ['a', 'c']var sparsekeys = Object.keys(arr); // ['0', '1']var denseKeyss = [...arr.keys()]; // [0, 1]
Array.prototype.lastIndexOf()
返回指定元素再数组中的最后一个索引,如果不存在则返回 -1. 从数组的后面向前查找,从 fromIndex 开始。
Array.prototype.map()
map() 创建一个新数组。
返回值: 一个新数组,每个元素都是回调函数的结果。
数组中每个元素的平方根
let numbers = [1, 4, 9]var roots = numbers.map(Math.sqrt)// roots [1, 2, 3]// numbers = [1, 4, 9]
使用技巧
['1', '2', '3'].map(parseInt) // [1, NaN, NaN]['1', '2', '3'].map(str => parseInt(str)) // [1, 2, 3]['1', '2', '3'].map(Number) // [1, 2, 3]['1.1', '2.2e2', '3e300'].map(Number) // [1.1, 220, 3e+300]
