- 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]) // true
Array.isArray({foo: 123}) // false
Array.isArray("foobar") // false
Array.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 = true
var 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) // false
var 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()
创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
// > 10
function 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}]
// es6
const 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]设置为undefined
a.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)) // -1
console.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) // false
arr.includes('c', 100) // false
如果fromIndex 为负值,计算出的索引将作为开始搜索的位置。如果计算出的索引小于0,则整个数组都会被搜索。
var arr = ['a', 'b', 'c']
arr.includes('a', -100); // true
arr.includes('b', -100); // true
arr.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]