# Array.every / Array.some
arr.every(callback(element[, index[, array]])[, thisArg])
数组中每一个对象是否 都 满足条件
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
arr.some(callback(element[, index[, array]])[, thisArg])
是否至少有一个元素满足条件
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true
# Array.from
Array.from 可以接受一个可迭代或类数组的值( 可迭代对象 ),并从中获取一个“真正的”数组。然后我们就可以对其调用数组方法了。
举例:
Array.from(map.keys())
Array.from(set)
# filter / map / reduce
var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
const nums = [10, 20, 300, 600, 400, 70, 2]
let nums1 = nums.filter(n => n < 100) // num1:[10,20,70,2]
var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])
callback
生成新数组元素的函数,使用三个参数:
currentValue``callback
数组中正在处理的当前元素。index
可选callback
数组中正在处理的当前元素的索引。array
可选map
方法调用的数组。
thisArg
可选执行 callback
函数时值被用作this
。
let nums2 = nums1.map(n => n * 2) //nums2:[20,40,140,4]
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
callback
执行数组中每个值 (如果没有提供 initialValue则第一个值除外
)的函数,包含四个参数:
- **
accumulator
**累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
(见于下方)。 currentValue
数组中正在处理的元素。index
可选数组中正在处理的当前元素的索引。 如果提供了initialValue
,则起始索引号为0,否则从索引1起始。array
可选调用reduce()
的数组
initialValue
可选作为第一次调用 callback
函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
let num3 = nums2.reduce((preValue, curValue) => {
return preValue + curValue
}, 5)//num3: 5+20+40+140+4 = 209
# 元素增删 push / pop / unshift / shift / slice
- push
push()
方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
- pop
pop()
方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
- unshift
unshift()
方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组**)**。
- shift
shift()
方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
- slicce
slice()
方法返回一个新的数组对象,这一对象是一个由 begin
和 end
决定的原数组的浅拷贝(包括 begin
,不包括end
)。原始数组不会被改变。
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]
const before = ['ant', 'bison', 'camel', 'duck', 'elephant'];
const after = before.slice(3)
console.log(before,after)
// expected output: Array ["ant", "bison", "camel", "duck", "elephant"] Array ["duck", "elephant"]
- splice
splice()
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]
months.splice(4, 1, 'May');
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]
# 查找元素 find/findIndex
找到第一个符合条件的元素/下标
const arr = [1, 2, 3, 4, 5]
const findItem = arr.find(item => item === 3) // 返回子项
const findIndex = arr.findIndex(item => item === 3) // 返回子项的下标
# 数组方法备忘单
- 添加/删除元素:
push(...items)
—— 向尾端添加元素,pop()
—— 从尾端提取一个元素,shift()
—— 从首端提取一个元素,unshift(...items)
—— 向首端添加元素,splice(pos, deleteCount, ...items)
—— 从pos
开始删除deleteCount
个元素,并插入items
。slice(start, end)
—— 创建一个新数组,将从索引start
到索引end
(但不包括end
)的元素复制进去。concat(...items)
—— 返回一个新数组:复制当前数组的所有元素,并向其中添加items
。如果items
中的任意一项是一个数组,那么就取其元素。
- 搜索元素:
indexOf/lastIndexOf(item, pos)
—— 从索引pos
开始搜索item
,搜索到则返回该项的索引,否则返回-1
。includes(value)
—— 如果数组有value
,则返回true
,否则返回false
。find/filter(func)
—— 通过func
过滤元素,返回使func
返回true
的第一个值/所有值。findIndex
和find
类似,但返回索引而不是值。
- 遍历元素:
forEach(func)
—— 对每个元素都调用func
,不返回任何内容。
- 转换数组:
map(func)
—— 根据对每个元素调用func
的结果创建一个新数组。sort(func)
—— 对数组进行原位(in-place)排序,然后返回它。reverse()
—— 原位(in-place)反转数组,然后返回它。split/join
—— 将字符串转换为数组并返回。reduce/reduceRight(func, initial)
—— 通过对每个元素调用func
计算数组上的单个值,并在调用之间传递中间结果。
- 其他:
Array.isArray(arr)
检查arr
是否是一个数组。
请注意,sort
,reverse
和 splice
方法修改的是数组本身。
这些是最常用的方法,它们覆盖 99% 的用例。但是还有其他几个:
- arr.some(fn)/arr.every(fn) 检查数组。
与map
类似,对数组的每个元素调用函数fn
。如果任何/所有结果为true
,则返回true
,否则返回false
。
这两个方法的行为类似于||
和&&
运算符:如果fn
返回一个真值,arr.some()
立即返回true
并停止迭代其余数组项;如果fn
返回一个假值,arr.every()
立即返回false
并停止对其余数组项的迭代。
我们可以使用every
来比较数组:
function arraysEqual(arr1, arr2) {
return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
}
alert( arraysEqual([1, 2], [1, 2])); // true
- arr.fill(value, start, end) —— 从索引
start
到end
,用重复的value
填充数组。 - arr.copyWithin(target, start, end) —— 将从位置
start
到end
的所有元素复制到 自身 的target
位置(覆盖现有元素)。 - arr.flat(depth)/arr.flatMap(fn) 从多维数组创建一个新的扁平数组。
- arr.of(element0[, element1[, …[, elementN]]]) 基于可变数量的参数创建一个新的
Array
实例,而不需要考虑参数的数量或类型。