Array 对象方法
| 方法 | 描述 |
|---|---|
| concat() | 连接两个或更多的数组,并返回结果。 |
| copyWithin() | 从数组的指定位置拷贝元素到数组的另一个指定位置中。 |
| entries() | 返回数组的可迭代对象。 |
| every() | 检测数值元素的每个元素是否都符合条件。 |
| fill() | 使用一个固定值来填充数组。 |
| filter() | 检测数值元素,并返回符合条件所有元素的数组。 |
| find() | 返回符合传入测试(函数)条件的数组元素。 |
| findIndex() | 返回符合传入测试(函数)条件的数组元素索引。 |
| forEach() | 数组每个元素都执行一次回调函数。 |
| from() | 通过给定的对象中创建一个数组。 |
| includes() | 判断一个数组是否包含一个指定的值。 |
| indexOf() | 搜索数组中的元素,并返回它所在的位置。 |
| isArray() | 判断对象是否为数组。 |
| join() | 把数组的所有元素放入一个字符串。 |
| keys() | 返回数组的可迭代对象,包含原始数组的键(key)。 |
| lastIndexOf() | 搜索数组中的元素,并返回它最后出现的位置。 |
| map() | 通过指定函数处理数组的每个元素,并返回处理后的数组。 |
| pop() | 删除数组的最后一个元素并返回删除的元素。 |
| push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 |
| reduce() | 将数组元素计算为一个值(从左到右)。 |
| reduceRight() | 将数组元素计算为一个值(从右到左)。 |
| reverse() | 反转数组的元素顺序。 |
| shift() | 删除并返回数组的第一个元素。 |
| slice() | 选取数组的的一部分,并返回一个新数组。 |
| some() | 检测数组元素中是否有元素符合指定条件。 |
| sort() | 对数组的元素进行排序。 |
| splice() | 从数组中添加或删除元素。 |
| toString() | 把数组转换为字符串,并返回结果。 |
| unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 |
| valueOf() | 返回数组对象的原始值。 |
Array - Javascript | MDN
Splice
splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])const months = ['Jan', 'March', 'April', 'June'];months.splice(1, 0, 'Feb');// inserts at index 1console.log(months);// expected output: Array ["Jan", "Feb", "March", "April", "June"]months.splice(4, 1, 'May');// replaces 1 element at index 4console.log(months);// expected output: Array ["Jan", "Feb", "March", "April", "May"]
示例
- 从第 2 位开始删除 0 个元素,插入“drum”
var myFish = ["angel", "clown", "mandarin", "sturgeon"];var removed = myFish.splice(2, 0, "drum");// 运算后的 myFish: ["angel", "clown", "drum", "mandarin", "sturgeon"]// 被删除的元素: [], 没有元素被删除
- 从第 2 位开始删除 0 个元素,插入“drum” 和 “guitar”
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];var removed = myFish.splice(2, 0, 'drum', 'guitar');// 运算后的 myFish: ["angel", "clown", "drum", "guitar", "mandarin", "sturgeon"]// 被删除的元素: [], 没有元素被删除
- 从第 3 位开始删除 1 个元素
var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];var removed = myFish.splice(3, 1);// 运算后的 myFish: ["angel", "clown", "drum", "sturgeon"]// 被删除的元素: ["mandarin"]
- 从第 2 位开始删除 1 个元素,插入“trumpet”
var myFish = ['angel', 'clown', 'drum', 'sturgeon'];var removed = myFish.splice(2, 1, "trumpet");// 运算后的 myFish: ["angel", "clown", "trumpet", "sturgeon"]// 被删除的元素: ["drum"]
- 从第 0 位开始删除 2 个元素,插入”parrot”、”anemone”和”blue”
var myFish = ['angel', 'clown', 'trumpet', 'sturgeon'];var removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');// 运算后的 myFish: ["parrot", "anemone", "blue", "trumpet", "sturgeon"]// 被删除的元素: ["angel", "clown"]
- 从第 2 位开始删除 2 个元素
var myFish = ['parrot', 'anemone', 'blue', 'trumpet', 'sturgeon'];var removed = myFish.splice(myFish.length - 3, 2);// 运算后的 myFish: ["parrot", "anemone", "sturgeon"]// 被删除的元素: ["blue", "trumpet"]
- 从倒数第 2 位开始删除 1 个元素
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];var removed = myFish.splice(-2, 1);// 运算后的 myFish: ["angel", "clown", "sturgeon"]// 被删除的元素: ["mandarin"]
- 从第 2 位开始删除所有元素
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];var removed = myFish.splice(2);// 运算后的 myFish: ["angel", "clown"]// 被删除的元素: ["mandarin", "sturgeon"]
Slice
**slice()** 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
arr.slice([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"]console.log(animals.slice(1, 5));// expected output: Array ["bison", "camel", "duck", "elephant"]
示例
- 返回现有数组的一部分
var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];var citrus = fruits.slice(1, 3);// fruits contains ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']// citrus contains ['Orange','Lemon']
译者注:citrus [n.] 柑橘类果实
- 使用
slice
`<br />
在下例中,slice从myCar中创建了一个新数组newCar。两个数组都包含了一个myHonda对象的引用。当myHonda的color属性改变为purple`,则两个数组中的对应元素都会随之改变。
// 使用 slice 方法从 myCar 中创建一个 newCar。var myHonda = { color: 'red', wheels: 4, engine: { cylinders: 4, size: 2.2 } };var myCar = [myHonda, 2, "cherry condition", "purchased 1997"];var newCar = myCar.slice(0, 2);// 输出 myCar、newCar 以及各自的 myHonda 对象引用的 color 属性。console.log(' myCar = ' + JSON.stringify(myCar));console.log('newCar = ' + JSON.stringify(newCar));console.log(' myCar[0].color = ' + JSON.stringify(myCar[0].color));console.log('newCar[0].color = ' + JSON.stringify(newCar[0].color));// 改变 myHonda 对象的 color 属性.myHonda.color = 'purple';console.log('The new color of my Honda is ' + myHonda.color);//输出 myCar、newCar 中各自的 myHonda 对象引用的 color 属性。console.log(' myCar[0].color = ' + myCar[0].color);console.log('newCar[0].color = ' + newCar[0].color);
上述代码输出:
myCar = [{color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2,'cherry condition', 'purchased 1997']newCar = [{color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2]myCar[0].color = rednewCar[0].color = redThe new color of my Honda is purplemyCar[0].color = purplenewCar[0].color = purple
- 类数组(Array-like)对象
slice 方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组。你只需将该方法绑定到这个对象上。 一个函数中的 arguments 就是一个类数组对象的例子。
function list() {return Array.prototype.slice.call(arguments);}var list1 = list(1, 2, 3); // [1, 2, 3]
除了使用 Array.prototype.slice.call(``arguments``),你也可以简单的使用 [].slice.call(arguments) 来代替。另外,你可以使用 bind 来简化该过程。
var unboundSlice = Array.prototype.slice;var slice = Function.prototype.call.bind(unboundSlice);function list() {return slice(arguments);}var list1 = list(1, 2, 3); // [1, 2, 3]
Indexof, LastIndexof
**indexOf()**方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
**lastIndexOf()** 方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。
arr.indexOf(searchElement[, fromIndex])arr.lastIndexOf(searchElement[, fromIndex])const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];console.log(beasts.indexOf('bison'));// expected output: 1// start from index 2console.log(beasts.indexOf('bison', 2));// expected output: 4console.log(beasts.indexOf('giraffe'));// expected output: -1
示例
- 使用indexOf
以下例子使用indexOf方法确定多个值在数组中的位置。
var array = [2, 5, 9];array.indexOf(2); // 0array.indexOf(7); // -1array.indexOf(9, 2); // 2array.indexOf(2, -1); // -1array.indexOf(2, -3); // 0
- 找出指定元素出现的所有位置
var indices = [];var array = ['a', 'b', 'a', 'c', 'a', 'd'];var element = 'a';var idx = array.indexOf(element);while (idx != -1) {indices.push(idx);idx = array.indexOf(element, idx + 1);}console.log(indices);// [0, 2, 4]
- 判断一个元素是否在数组里,不在则更新数组
function updateVegetablesCollection (veggies, veggie) {if (veggies.indexOf(veggie) === -1) {veggies.push(veggie);console.log('New veggies collection is : ' + veggies);} else if (veggies.indexOf(veggie) > -1) {console.log(veggie + ' already exists in the veggies collection.');}}var veggies = ['potato', 'tomato', 'chillies', 'green-pepper'];// New veggies collection is : potato,tomato,chillies,green-papper,spinachupdateVegetablesCollection(veggies, 'spinach');// spinach already exists in the veggies collection.updateVegetablesCollection(veggies, 'spinach');
every
**every()** 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
arr.every(callback[, thisArg])const isBelowThreshold = (currentValue) => currentValue < 40;const array1 = [1, 30, 39, 29, 10, 13];console.log(array1.every(isBelowThreshold));// expected output: true
例子
- 检测所有数组元素的大小
下例检测数组中的所有元素是否都大于 10。
function isBigEnough(element, index, array) {return element >= 10;}[12, 5, 8, 130, 44].every(isBigEnough); // false[12, 54, 18, 130, 44].every(isBigEnough); // true
- 使用箭头函数
箭头函数为上面的检测过程提供了更简短的语法。
[12, 5, 8, 130, 44].every(x => x >= 10); // false[12, 54, 18, 130, 44].every(x => x >= 10); // true
forEach
**forEach()** 方法对数组的每个元素执行一次提供的函数。
arr.forEach(callback(currentValue [, index [, array]])[, thisArg]);const array1 = ['a', 'b', 'c'];array1.forEach(element => console.log(element));// expected output: "a"// expected output: "b"// expected output: "c"
示例
- 不对未初始化的值进行任何操作(稀疏数组)
如你所见,3 和 7 之间空缺的数组单元未被 forEach() 调用 callback 函数,或进行任何其他操作。
const arraySparse = [1,3,,7];let numCallbackRuns = 0;arraySparse.forEach(function(element){console.log(element);numCallbackRuns++;});console.log("numCallbackRuns: ", numCallbackRuns);// 1// 3// 7// numCallbackRuns: 3
- 将 for 循环转换为 forEach
const items = ['item1', 'item2', 'item3'];const copy = [];// beforefor (let i=0; i<items.length; i++) {copy.push(items[i]);}// afteritems.forEach(function(item){copy.push(item);});
map
**map()** 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
const array1 = [1, 4, 9, 16];// pass a function to mapconst map1 = array1.map(x => x * 2);console.log(map1);// expected output: Array [2, 8, 18, 32]
示例
- 求数组中每个元素的平方根
下面的代码创建了一个新数组,值为原数组中对应数字的平方根。
var numbers = [1, 4, 9];var roots = numbers.map(Math.sqrt);// roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9]
- 使用 map 重新格式化数组中的对象
以下代码使用一个包含对象的数组来重新创建一个格式化后的数组。
var kvArray = [{key: 1, value: 10},{key: 2, value: 20},{key: 3, value: 30}];var reformattedArray = kvArray.map(function(obj) {var rObj = {};rObj[obj.key] = obj.value;return rObj;});// reformattedArray 数组为: [{1: 10}, {2: 20}, {3: 30}],// kvArray 数组未被修改:// [{key: 1, value: 10},// {key: 2, value: 20},// {key: 3, value: 30}]
reduce
**reduce()** 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])const array1 = [1, 2, 3, 4];const reducer = (accumulator, currentValue) => accumulator + currentValue;// 1 + 2 + 3 + 4console.log(array1.reduce(reducer));// expected output: 10// 5 + 1 + 2 + 3 + 4console.log(array1.reduce(reducer, 5));// expected output: 15// 后面的5表示reducer的初始值
reducer 函数接收4个参数:
- Accumulator (acc) (累计器)
- Current Value (cur) (当前值)
- Current Index (idx) (当前索引)
- Source Array (src) (源数组)
reverse
**reverse()** 方法将数组中元素的位置颠倒,并返回该数组。数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组。
arr.reverse();const array1 = ['one', 'two', 'three'];console.log('array1:', array1);// expected output: "array1:" Array ["one", "two", "three"]const reversed = array1.reverse();console.log('reversed:', reversed);// expected output: "reversed:" Array ["three", "two", "one"]// Careful: reverse is destructive -- it changes the original array.console.log('array1:', array1);// expected output: "array1:" Array ["three", "two", "one"]
some
**some()** 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
arr.some(callback(element[, index[, array]])[, thisArg])const array = [1, 2, 3, 4, 5];// checks whether an element is evenconst even = (element) => element % 2 === 0;console.log(array.some(even));// expected output: true
示例
- 测试数组元素的值
下面的例子检测在数组中是否有元素大于 10。
function isBiggerThan10(element, index, array) {return element > 10;}[2, 5, 8, 1, 4].some(isBiggerThan10); // false[12, 5, 8, 1, 4].some(isBiggerThan10); // true
- 使用箭头函数测试数组元素的值
箭头函数 可以通过更简洁的语法实现相同的用例.
[2, 5, 8, 1, 4].some(x => x > 10); // false[12, 5, 8, 1, 4].some(x => x > 10); // true
- 判断数组元素中是否存在某个值
此例中为模仿 includes() 方法, 若元素在数组中存在, 则回调函数返回值为 true :
var fruits = ['apple', 'banana', 'mango', 'guava'];function checkAvailability(arr, val) {return arr.some(function(arrVal) {return val === arrVal;});}checkAvailability(fruits, 'kela'); // falsecheckAvailability(fruits, 'banana'); // true
- 使用箭头函数判断数组元素中是否存在某个值
var fruits = ['apple', 'banana', 'mango', 'guava'];function checkAvailability(arr, val) {return arr.some(arrVal => val === arrVal);}checkAvailability(fruits, 'kela'); // falsecheckAvailability(fruits, 'banana'); // true
- 将任意值转换为布尔类型
var TRUTHY_VALUES = [true, 'true', 1];function getBoolean(value) {'use strict';if (typeof value === 'string') {value = value.toLowerCase().trim();}return TRUTHY_VALUES.some(function(t) {return t === value;});}getBoolean(false); // falsegetBoolean('false'); // falsegetBoolean(1); // truegetBoolean('true'); // true
filter
**filter()** 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];const result = words.filter(word => word.length > 6);console.log(result);// expected output: Array ["exuberant", "destruction", "present"]
示例
- 筛选排除所有较小的值
下例使用 filter 创建了一个新数组,该数组的元素由原数组中值大于 10 的元素组成。
function isBigEnough(element) {return element >= 10;}var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);// filtered is [12, 130, 44]
- 过滤 JSON 中的无效条目
以下示例使用 filter() 创建具有非零 id 的元素的 json。
var arr = [{ id: 15 },{ id: -1 },{ id: 0 },{ id: 3 },{ id: 12.2 },{ },{ id: null },{ id: NaN },{ id: 'undefined' }];var invalidEntries = 0;function isNumber(obj) {return obj !== undefined && typeof(obj) === 'number' && !isNaN(obj);}function filterByID(item) {if (isNumber(item.id) && item.id !== 0) {return true;}invalidEntries++;return false;}var arrByID = arr.filter(filterByID);console.log('Filtered Array\n', arrByID);// Filtered Array// [{ id: 15 }, { id: -1 }, { id: 3 }, { id: 12.2 }]console.log('Number of Invalid Entries = ', invalidEntries);// Number of Invalid Entries = 5
- 在数组中搜索
下例使用 filter() 根据搜索条件来过滤数组内容。
var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];/*** Array filters items based on search criteria (query)*/function filterItems(query) {return fruits.filter(function(el) {return el.toLowerCase().indexOf(query.toLowerCase()) > -1;})}console.log(filterItems('ap')); // ['apple', 'grapes']console.log(filterItems('an')); // ['banana', 'mango', 'orange']
ES2015 实现
const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];/*** Array filters items based on search criteria (query)*/const filterItems = (query) => {return fruits.filter((el) =>el.toLowerCase().indexOf(query.toLowerCase()) > -1);}console.log(filterItems('ap')); // ['apple', 'grapes']console.log(filterItems('an')); // ['banana', 'mango', 'orange']
