javascript-数组
随着时间的推移,JavaScript 数组有了越来越多的功能,有时候想知道何时应该使用何种方法是个很棘手的问题。本节旨在解释您应该在什么场景下使用什么方法,截至 2018 年。
初始化数组
JavaScript 代码:
1 | const a = []; |
Array.of()
方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
Array.of()
和 Array 构造函数之间的区别在于处理整数参数:Array.of(7)
创建一个具有单个元素 7
的数组,而 Array(7)
创建一个长度为 7的空数组(注意:这是指一个有 7 个空位(empty
)的数组,而不是由 7 个 undefined
组成的数组)。
1 | Array.of(7); // [7] |
Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例。
1 | Array.from('foo'); // ["f", "o", "o"] |
不要使用旧语法(只是将它用于类型化数组)
JavaScript 代码:
1 | const a = new Array(); //never use |
获取数组长度
JavaScript 代码:
1 | const l = a.length; |
使用 every 迭代数组
every()
方法测试数组的所有元素是否都通过了指定函数的测试。
JavaScript 代码:
1 | a.every(f); |
迭代 a
直到 f()
返回 false
。
使用 some 迭代数组
some() 方法测试数组中的某些元素是否通过由指定函数的真值测试。
JavaScript 代码:
1 | a.some(f); |
迭代 a
直到 f()
返回 true
。
遍历数组并返回函数结果组成的新数组 map
JavaScript 代码:
1 | const b = a.map(f); |
遍历 a
,返回每一个 a
元素执行 f()
产生的结果数组。
过滤数组 filter
JavaScript 代码:
1 | const b = a.filter(f); |
遍历 a
,返回每一个 a
元素执行 f()
都为 true
的新数组。
Reduce
JavaScript 代码:
1 | a.reduce((accumulator, currentValue, currentIndex, array) => { |
reduce()
对数组中每一项都调用回调函数,并逐步计算计算结果。如果 initaiValue
存在,accumulator
在第一次迭代时等于这个值。
示例:
JavaScript 代码:
1 | [1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => { |
forEach
ES6 新增。
JavaScript 代码:
1 | a.forEach(f); |
遍历 a
执行 f
,中途不能停止。 return
break
continue
都不行
示例:
JavaScript 代码:
1 | a.forEach((v) => { |
for..of
ES6 新增。
JavaScript 代码:
1 | for (let v of a) { |
for
JavaScript 代码:
1 | for (let i = 0; i < a.length; i += 1) { |
遍历 a
,可以通过 return
或者 break
中止循环,通过 continue
跳出循环。
@@iterator
ES6 新增。
获取数组迭代器的值:
JavaScript 代码:
1 | const a = [1, 2, 3]; |
.entries()
返回一个键值对的迭代器:
JavaScript 代码:
1 | let it = a.entries(); |
.keys()
返回包含所有键名的迭代器:
JavaScript 代码:
1 | let it = a.keys(); |
数组结束时 .next()
返回 undefined
。你可以通过 it.next()
返回的 value
, done
值检测迭代是否结束。当迭代到最后一个元素时 done
的值始终为 true
。
在数组末尾追加值
JavaScript 代码:
1 | a.push(4); |
在数组开头添加值
JavaScript 代码:
1 | a.unshift(0); |
移除数组中的值
删除末尾的值
JavaScript 代码:
1 | a.pop(); |
删除开头的值
JavaScript 代码:
1 | a.shift(); |
删除任意位置的值
JavaScript 代码:
1 | a.splice(0, 2); // 删除前2项元素 |
不要使用 remove()
,因为它会留下未定义的值。
移除并插入值
JavaScript 代码:
1 | a.splice(2, 3, 2, 'a', 'b'); |
合并多个数组
JavaScript 代码:
1 | const a = [1, 2]; |
查找数组中特定元素
ES5 写法:
JavaScript 代码:
1 | a.indexOf(); |
返回匹配到的第一个元素的索引,元素不存在返回 -1
。
JavaScript 代码:
1 | a.lastIndexOf(); |
返回匹配到的最后一个元素的索引,元素不存在返回 -1
。
ES6 写法:
JavaScript 代码:
1 | a.find((element, index, array) => { |
返回符合条件的第一个元素,如果不存在返回 undefined
。
通常这么用:
JavaScript 代码:
1 | a.find((x) => x.id === my_id); |
上面的例子会返回数组中 id === my_id
的第一个元素。
findIndex
返回符合条件的第一个元素的索引,如果不存在返回 undefined
:
JavaScript 代码:
1 | a.findIndex((element, index, array) => { |
ES7 写法:
JavaScript 代码:
1 | a.includes(value); |
如果 a
包含 value
返回 true
。
JavaScript 代码:
1 | a.includes(value, i); |
如果 a
从位置 i
后包含 value
返回 true
。
数组排序
按字母顺序排序(按照 ASCII 值 – 0-9A-Za-z
):
JavaScript 代码:
1 | const a = [1, 2, 3, 10, 11]; |
自定义排序
JavaScript 代码:
1 | const a = [1, 10, 3, 2, 11]; |
逆序
JavaScript 代码:
1 | a.reverse(); |
数组转字符串
JavaScript 代码:
1 | a.toString(); |
返回字符串类型的值
JavaScript 代码:
1 | a.join(); |
返回数组元素拼接的字符串。传递参数以自定义分隔符:
JavaScript 代码:
1 | a.join(','); |
复制所有值
JavaScript 代码:
1 | const b = Array.from(a); |
复制部分值
JavaScript 代码:
1 | const b = Array.from(a, (x) => x % 2 == 0); |
将值复制到本身其它位置
Array.prototype.copyWithin()
JavaScript 代码:
1 | const a = [1, 2, 3, 4]; |
拷贝几个元素,就从插入位置开始替换几个元素。