JavaScript ES5 - ES11 提供的数组操作方法

4 阅读7分钟

JavaScript ES5 - ES 11 提供 数组操作方法****

 

ES5 数组方法****

ES5 中提供了很多常用的数组方法,主要是数组的遍历、操作和排序等功能。

 

1. push()****

将一个或多个元素添加到数组的末尾,并返回新数组的长度。

 

javascript

var arr = [1, 2, 3];

arr.push(4);  // [1, 2, 3, 4]

console.log(arr);  // 输出:[1, 2, 3, 4]

2. pop()****

删除数组的最后一个元素,并返回该元素。

 

javascript

var arr = [1, 2, 3];

var popped = arr.pop();  // 3

console.log(arr);  // 输出:[1, 2]

console.log(popped);  // 输出:3

3. shift()****

删除数组的第一个元素,并返回该元素。

 

javascript

var arr = [1, 2, 3];

var shifted = arr.shift();  // 1

console.log(arr);  // 输出:[2, 3]

console.log(shifted);  // 输出:1

4. unshift()****

将一个或多个元素添加到数组的开头,并返回新数组的长度。

 

javascript

var arr = [1, 2, 3];

arr.unshift(0);  // [0, 1, 2, 3]

console.log(arr);  // 输出:[0, 1, 2, 3]

5. concat()****

连接两个或更多的数组,并返回一个新数组。

 

javascript

var arr1 = [1, 2];

var arr2 = [3, 4];

var arr3 = arr1.concat(arr2);  // [1, 2, 3, 4]

console.log(arr3);  // 输出:[1, 2, 3, 4]

6. slice()****

返回数组的指定部分,原数组不变。

 

javascript

var arr = [1, 2, 3, 4];

var sliced = arr.slice(1, 3);  // [2, 3]

console.log(sliced);  // 输出:[2, 3]

console.log(arr);  // 输出:[1, 2, 3, 4]  (原数组未变)

7. splice()****

从数组中添加或删除元素。

 

javascript

var arr = [1, 2, 3, 4];

arr.splice(1, 2, 'a', 'b');  // 从索引1开始删除2个元素,并插入 'a', 'b'

console.log(arr);  // 输出:[1, 'a', 'b', 4]

8. forEach()****

对数组中的每个元素执行指定的函数。

 

javascript

var arr = [1, 2, 3];

arr.forEach(function(item, index) {

  console.log(index, item);  // 输出:0 1, 1 2, 2 3

});

9. map()****

返回一个新数组,数组中的每个元素都是调用回调函数处理后的结果。

 

javascript

var arr = [1, 2, 3];

var mapped = arr.map(function(item) {

  return item * 2;

});

console.log(mapped);  // 输出:[2, 4, 6]

10. filter()****

返回一个新数组,包含所有符合条件的元素。

 

javascript

var arr = [1, 2, 3, 4];

var filtered = arr.filter(function(item) {

  return item % 2 === 0;  // 筛选出偶数

});

console.log(filtered);  // 输出:[2, 4]

11. reduce()****

从左到右地逐步应用一个回调函数,最终返回一个单一的结果。

 

javascript

var arr = [1, 2, 3, 4];

var sum = arr.reduce(function(accumulator, currentValue) {

  return accumulator + currentValue;

}, 0);

console.log(sum);  // 输出:10

12. indexOf()****

返回数组中第一个匹配项的索引,如果没有找到则返回 -1。

 

javascript

var arr = [1, 2, 3];

console.log(arr.indexOf(2));  // 输出:1

console.log(arr.indexOf(4));  // 输出:-1

ES6 数组方法****

1. find()****

返回数组中第一个符合条件的元素。如果没有符合条件的元素,则返回 undefined。

 

javascript

var arr = [5, 12, 8, 130, 44];

var found = arr.find(function(element) {

  return element > 10;

});

console.log(found);  // 输出:12

2. findIndex()****

返回数组中第一个符合条件的元素的索引。如果没有符合条件的元素,则返回 -1。

 

javascript

var arr = [5, 12, 8, 130, 44];

var index = arr.findIndex(function(element) {

  return element > 10;

});

console.log(index);  // 输出:1

3. includes()****

判断数组是否包含某个元素,返回 true 或 false。

 

javascript

var arr = [1, 2, 3, 4];

console.log(arr.includes(2));  // 输出:true

console.log(arr.includes(5));  // 输出:false

4. copyWithin()****

浅拷贝数组的一部分到同一个数组内的另一个位置。

 

javascript

var arr = [1, 2, 3, 4, 5];

arr.copyWithin(0, 3, 5);  // 将索引3到索引5之间的元素复制到索引0到索引2的位置

console.log(arr);  // 输出:[4, 5, 3, 4, 5]

5. from()****

将类数组对象或可迭代对象转换为数组。

 

javascript

var str = 'hello';

var arr = Array.from(str);  // ['h', 'e', 'l', 'l', 'o']

console.log(arr);

6. keys()****

返回一个新的数组迭代器对象,该对象包含数组中每个索引的键。

 

javascript

var arr = ['a', 'b', 'c'];

var keys = arr.keys();

console.log([...keys]);  // 输出:[0, 1, 2]

7. values()****

返回一个新的数组迭代器对象,该对象包含数组中每个索引对应的值。

 

javascript

var arr = ['a', 'b', 'c'];

var values = arr.values();

console.log([...values]);  // 输出:['a', 'b', 'c']

8. entries()****

返回一个新的数组迭代器对象,该对象包含数组中每个索引和值的对。

 

javascript

var arr = ['a', 'b', 'c'];

var entries = arr.entries();

console.log([...entries]);  // 输出:[[0, 'a'], [1, 'b'], [2, 'c']]

9. flat()****

将嵌套的数组“拉平”为一维数组。

 

javascript

var arr = [1, [2, 3], [4, [5, 6]]];

var flattened = arr.flat(2);  // 拉平两层

console.log(flattened);  // 输出:[1, 2, 3, 4, 5, 6]

10. flatMap()****

首先使用映射函数对数组元素进行映射,然后将结果“拉平”为一维数组。

 

javascript

var arr = [1, 2, 3];

var flattened = arr.flatMap(x => [x, x * 2]);

console.log(flattened);  // 输出:[1, 2, 2, 4, 3, 6]

11. sort()****

对数组中的元素进行排序,默认是按字符编码顺序。

 

javascript

var arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];

arr.sort();  // 字符排序

console.log(arr);  // 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

 

 

ES7 (ECMAScript 2016) 新增数组方法****

 

1. includes()****

includes() 方法判断数组是否包含某个指定的元素,返回 true 或 false。它比 indexOf() 更直观,因为它直接返回布尔值,而不是索引。

 

javascript

const arr = [1, 2, 3, 4, 5];

 

console.log(arr.includes(3));  // 输出:true

console.log(arr.includes(6));  // 输出:false

ES8 (ECMAScript 2017) 新增数组方法****

1. Object.values()****

Object.values() 方法返回给定对象的所有值,返回一个包含对象所有值的数组。这个方法对于处理非数组的对象非常有用。

 

javascript

const obj = { a: 1, b: 2, c: 3 };

const values = Object.values(obj);  // [1, 2, 3]

console.log(values);

虽然 Object.values() 主要是对对象的操作,但它也为数组或类数组对象提供了新的方法,尤其在处理对象数据时非常有用。

 

2. Object.entries()****

Object.entries() 返回给定对象自身所有的键值对数组(一个二维数组)。每个键值对都是一个数组,形式为 [key, value]。

 

javascript

const obj = { a: 1, b: 2, c: 3 };

const entries = Object.entries(obj);  // [['a', 1], ['b', 2], ['c', 3]]

console.log(entries);

3. Array.prototype.flat()****

flat() 方法会将数组中的嵌套数组展开为一维数组。flat() 可以指定展开的层数,默认为 1 层。

 

javascript

const arr = [1, 2, [3, 4, [5, 6]]];

console.log(arr.flat());  // 输出:[1, 2, 3, 4, [5, 6]]

console.log(arr.flat(2));  // 输出:[1, 2, 3, 4, 5, 6]

4. Array.prototype.flatMap()****

flatMap() 方法先对数组中的每个元素进行映射(通过回调函数),然后将结果“拉平”为一维数组。

 

javascript

const arr = [1, 2, 3];

const flatMapped = arr.flatMap(x => [x, x * 2]);

console.log(flatMapped);  // 输出:[1, 2, 2, 4, 3, 6]

flatMap() 是 map() 和 flat() 的组合,先进行映射操作,然后再将结果进行拉平,十分高效。

 

5. String.prototype.padStart() 和 String.prototype.padEnd()(补齐方法)****

虽然这些方法属于字符串类型,但它们有时也会在数组处理时用到,尤其是需要按某种规则填充字符串数组的情况。

 

javascript

// 对数字进行字符串补齐

const numArr = [1, 23, 456];

const padded = numArr.map(num => String(num).padStart(5, '0'));

console.log(padded);  // 输出:['00001', '00023', '00456']

ES9 (ECMAScript 2018) 新增数组方法****

1. Array.prototype.sort()(稳定排序)****

在 ES9 中,sort() 方法的行为发生了变化,增加了对排序稳定性的保证。之前,sort() 方法排序是“不稳定”的(即相同的元素可能排序后会交换位置),而从 ES9 开始,sort() 实现了稳定排序。这个特性并不直接体现在新的 API 上,但它改善了 sort() 的一致性。

 

javascript

const arr = [3, 1, 2, 3];

arr.sort((a, b) => a - b);

console.log(arr);  // 输出:[1, 2, 3, 3]

2. Object.fromEntries()****

与 Object.entries() 配对使用,它将一个键值对数组转换为对象。这对于将 Map 转换为对象非常有用。

 

javascript

const entries = [['a', 1], ['b', 2], ['c', 3]];

const obj = Object.fromEntries(entries);

console.log(obj);  // 输出:{a: 1, b: 2, c: 3}

ES10 (ECMAScript 2019) 新增数组方法****

ES10 中主要增加了 Array.prototype.flatMap() 和一些更常见的用法。

1. Array.prototype.flat()****

这在 ES8 中已经引入,但在 ES10 中做了进一步增强(例如它对深度更大的嵌套数组的展开效果)。

javascript

const nestedArray = [1, [2, [3, [4, [5]]]]];

const flattened = nestedArray.flat(3);

console.log(flattened);  // 输出:[1, 2, 3, 4, 5]

ES11 (ECMAScript 2020) 新增数组方法****

1. Array.prototype.reduceRight()****

reduceRight() 是 reduce() 的逆操作,它是从右往左执行的版本。此方法对数组中的元素从右向左进行累加操作。

 

const arr = [1, 2, 3, 4];

const sum = arr.reduceRight((acc, curr) => acc + curr);

console.log(sum);  // 输出:10

2. Array.prototype.at()****

at() 方法接受一个整数值作为参数,并返回该数组中对应的元素。正数值表示从数组开始的索引,负数表示从数组末尾的索引(-1 是最后一个元素)。

 

javascript

const arr = [10, 20, 30, 40];

console.log(arr.at(1));  // 输出:20

console.log(arr.at(-1));  // 输出:40

总结****

到目前为止,ES7、ES8、ES9、ES10 和 ES11 通过提供一些新方法和增强现有方法,使得数组的操作更加简便、灵活。例如,includes() 在 ES7 中的引入,flat() 和 flatMap() 在 ES8 中的出现,reduceRight() 和 at() 在后续版本中的增强,都为开发者提供了更多的工具来简化数组的处理和操作。

 

这些新增方法对于提高代码可读性、减少错误和增强性能都有很大的帮助。