数组方法

1. Array.isArray

  • 检测一个值是否是数组
  • @param obj {object} 需要检测的值
  • @return {boolean}
Array.isArray([1, 2, 3]);  // true
Array.isArray({foo: 123}); // false
Array.isArray("foobar"); // false   
Array.isArray(undefined);  // false

2. Array.prototype.concat

  • 将数组和参数拼接起来
  • @param valueN {arbitrary type} 任意类型需要拼接的值
  • @return {array} 新的数组实例
var arr = [1, 2, 3]; 
console.log(arr.concat([4, 5])); 
// [1, 2, 3, 4, 5] concat会把第一个[]默认“去掉”后加入
console.log(arr.concat(4, 5)); // [1, 2, 3, 4, 5]
console.log(arr.concat([[4, 5]])) // [1, 2, 3, [4, 5]] 第二个[]不“去掉”
console.log(arr.concat({})); // [1, 2, 3, {}] 
console.log(arr.concat(function(){})); // [1, 2, 3, function(){}]
console.log(arr.concat('123')); // [1, 2, 3, '123']
console.log(arr.concat(true)); // [1, 2, 3, true]

3.Array.prototype.every

  • 测试数组中是否每一个元素都满足某个条件
    处理过程:每次将数组中的一个元素作为第一个实参调用callback,如果每次都返回true,则函数返回true;如果有一个返回false,则函数返回false
  • @param callback {function} 说明测试条件的函数
  • @param thisArg {object} 可选 每次调用callback时this指向的值,如果不指定,在普通模式下,为顶层对象;严格模式为undefined
  • @return {boolean} 如果都满足条件,返回true;否则,返回false
3.1. 不使用thisArg:
var arr = [1, 2, 3]
function callback(value){
    return value > 0; 
}
var result = arr.every(callback);
console.log(result); // true
3.2 使用thisArg:
var arr = [1, 2, 3];
function callback(value){
    return value > this.length;
} 
var result = arr.every(callback);
console.log(result); // true 因为window.length等于0

var result = arr.every(callback, [1, 1]);
console.log(result); // false 因为[1, 1].length等于2,而arr中元素1小于2

4. Array.prototype.filter

  • 把数组中通过某个条件测试的元素筛选出来
  • @param callback {function} 说明测试条件的函数
    • @param element {arbitrary type} 当前处理的元素
    • @param index {number} 可选 当前处理元素的索引
    • @param array {array} 可选 调用filter函数的this(原数组)
  • @param thisArg {object} 可选 调用callback的this,同上
  • @return {array} 返回一个新数组,元素都是过滤后剩下的元素
function odd(element){
    return element % 2 !== 0;
} 

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var result = arr.filter(odd);
console.log(result); // [1, 3, 5, 7, 9]

5.Array.prototype.forEach

  • 对数组的每个元素执行一次提供的函数。
  • @param callback {function} 执行函数
    • @param currentValue {arbitrary type} 数组中正在处理的当前元素。
    • @param index {number} 可选 数组中正在处理的当前元素的索引。
    • @param array {array} 可选 forEach()方法正在操作的数组。
  • @param thisArg {object} 可选 当执行回调 函数时用作this的值
5.1 不改变原数组
function callback(currentValue, index, array){
    doubleArr.push(currentValue * 2);
}
var arr = [1, 2, 3, 4, 5];
var doubleArr = [];
arr.forEach(callback);
console.log(arr); // [1, 2, 3, 4, 5]
console.log(doubleArr) // [2, 4, 6, 8, 10]
5.2 改变原数组
// 方式一:
var arr = [1, 2, 3, 4, 5];
arr.forEach(function(currentValue, index, array){
    this[index] = currentValue * 2; 
}, arr);
console.log(arr); // [2, 4, 6, 8, 10]

// 方式二:
var arr = [1, 2, 3, 4, 5];
arr.forEach(function(currentValue, index, array){
    array[index] = currentValue * 2; 
});
console.log(arr); // [2, 4, 6, 8, 10]

6.Array.prototype.join

  • 将数组的所有元素连接成一个字符串并返回这个字符串
  • @param separator {string} 默认为"," 连接时的分隔符
  • @return {string} 结果字符串。如果 arr.length0,则返回空字符串
function train_join(arr, separator=','){
    var result = arr.join(separator);
    console.log(result);
}
var arr = [1, 2, 3, 4];
train_join(arr); // '1,2,3,4'
var arr = [1, 2, [3], 4]
train_join(arr); // '1,2,3,4'
var arr = [1, 2, [[3]], 4] 
train_join(arr);  // '1,2,3,4'

7.Array.prototype.indexOf

  • 返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1
  • @param searchElement {arbitrary type} 要查找的元素
  • @param formIndex 可选 开始查找的位置。默认值为0
  • @return {number} 首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1
7.1 获取特定元素的所有索引
/**
    查找数组中特定元素的所有索引    
    @param element {arbitrary type} 需要查找的元素
    @param fromIndex {number} 开始查找的位置, 默认为0
    @return 
        如果找到元素: {array} 存放所有索引的数组
        如果找不到元素:{number} -1
*/
Array.prototype.allIndexOf = function(element, fromIndex='0'){
    var result = [];
    var curIndex;
    do{
        curIndex = this.indexOf(element, fromIndex);
        result.push(curIndex);
        fromIndex = curIndex + 1;
    }while(curIndex !== -1);

    result.pop(); // 把-1去掉

    return result.length ? result : -1;  
}
7.2 fromIndex为负数时
function train_indexOf(arr, element, fromIndex){
    var result = arr.indexOf(element, fromIndex);
    console.log(result);
}
var arr = [1, 2, 3];
train_indexOf(arr, 2, -3); // 1
train_indexOf(arr, 2, -2); // 1
train_indexOf(arr, 2, -1); // -1

可以发现,即使fromIndex为负数,indexOf函数仍然是从头到尾扫描数组的,如果在[fromIndex, length-1]范围找到元素,那么就返回元素的在原数组的索引;否则,返回-1

8. Array.prototype.lastIndexOf

  • 返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。
  • @param searchElement {arbitrary type} 寻找的元素
  • @param fromIndex {number} 可选 从此位置开始逆向查找。默认为数组的长度减 1
  • @return {number} 返回元素的索引,如果找不到,返回-1
function train_lastIndexOf(arr, element, fromIndex){
    fromIndex = fromIndex || arr.length-1;
    var result = arr.lastIndexOf(element, fromIndex);
    console.log(result);
}
var arr = [1, 2, 3];
train_lastIndexOf(arr, 2); // 1, 在[0, length-1]从后往前找
train_lastIndexOf(arr, 2, -2); // 1, 在[0, length-2]从后往前找

同indexOf一样,无论fromIndex是正还是负,查找顺序不变,返回的是在原数组的索引

9. Array.prototype.map

  • 创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
  • @param callback {function} 生成新数组元素的函数
    • @param currentValue {arbitrary type} 当前元素
    • @param index {number} 可选 当前元素的索引
    • @param array {array} 可选 原数组
  • @param thisArg {object} 可选 执行 callback 函数时使用的this 值。
  • @return {array} 一个新数组,每个元素都是回调函数的结果。
function callback(currentVale, index, array){
    return currentVale * 2;
}    
var arr = [1, 2, 3];
var result = arr.map(callback);
console.log(result); // [2, 4, 6]

10. Array.prototype.push

  • 将一个或多个元素添加到数组的末尾,并返回新数组的长度。改变原数组
  • @param elementN {arbitrary type} 待添加元素
  • @return {number} 改变后数组的长度
10.1 测试
function train_push(){
    var arr = Array.prototype.shift.call(arguments);
    var length = Array.prototype.push.apply(arr,arguments);
    console.log(length);
    console.log(arr);
}
var arr = [1, 2, 3];
train_push(arr, 1, 2, 3); // 6, [1, 2, 3, 1, 2, 3]
var arr = [1, 2, 3];
train_push(arr, [1, 2, 3]); // 4, [1, 2, 3, [1, 2, 3]]
10.2 用arr来代替elementN传递多个需要添加的元素
/**
    通过数组形参的方式,push多个元素到原数组
    @return {number} 改变后数组的长度
*/
Array.prototype.pushElments = function(){
    Array.prototype.push.apply(this, arguments[0]);
    return this.length;  
}
var arr = [1, 2, 3];
arr.pushElments([1, 2, 3]);
console.log(arr);

11. Array.prototype.pop

  • 从数组中删除最后一个元素,并返回该元素的值。改变原数组
  • @return {arbitrary type} 返回删除的元素,如果原数组为空,则返回undefined
var arr = [1, 2, 3];
var element = arr.pop();
console.log(element); // 3
console.log(arr); // [1,2]

12. Array.prototype.reverse

  • 将原数组中元素的位置颠倒。改变原数组
  • @return {array} 数组的引用
var arr = [1, 2, 3];
var result = arr.reverse();
console.log(result); // [3, 2, 1]
console.log(arr); // [3, 2, 1]

13. Array.prototype.sort

  • 排序数组 排序不一定是稳定的。默认排序顺序是根据字符串Unicode码点。改变原数组。
  • @param compareFunction {function} 可选 用来指定按某种顺序进行排列的函数。默认为根据字符串Unicode码点排序。
    • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
    • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
    • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
  • @return {array} 排序后的数组
// 从小到大排序    
function compareFunction1(a, b){
    /*
        1. 当a < b时,a-b < 0,a(小值)排在b(大值)前面
        2. 当a > b时,a-b > 0,a(大值)排在b(小值)后面  
        => 把小值排在前面
    */
    return a - b;
}
// 从大到小排序
function compareFunction2(a, b){
    /*
        1. 当a < b时,b-a > 0,a(小值)排在b(大值)后面
        2. 当a > b时,b-a < 0,a(大值)排在b(小值)前面 
        => 把大值排在前面
    */
    return b - a;
}
function train_sort(arr, func){
    var result = arr.sort(func);
    console.log(result);
}
var arr = [1, 2, 3];
train_sort(arr, compareFunction1); // [1, 2, 3]
var arr = [1, 2, 3];
train_sort(arr, compareFunction2); // [3, 2, 1]

可以得到的结论是:
如果a<b时,compareFunction返回的结果小于0,那么正序;
如果a<b时,compareFunction返回的结果大于0,那么逆序。

14. Array.prototype.shift

  • 从数组中删除第一个元素,并返回该元素的值。改变原数组
  • @return {arbitrary type} 返回删除的元素,如果是原数组为空,返回undefined
var arr = [1, 2, 3];
var firstElement = arr.shift();
console.log(firstElement); // 1
console.log(arr); // [2, 3]

15. Array.prototype.unshift

  • 将一个或多个元素添加到数组的开头,并返回新数组的长度。改变原数组
  • @param elementN {arbitrary type} 要添加到数组开头的元素。
  • @return {number} 改变后数组的长度
15.1 测试
var arr = [1, 2, 3];
arr.unshift(1);
console.log(arr); // [1, 1, 2, 3]
var arr = [1, 2, 3];
arr.unshift([1, 2]);
console.log(arr); // [[1, 2], 1, 2, 3]
15.2 使用数组替代elementN
/**
   在数组开头插入若干元素
   @param arr {array} 待插入元素组成的数组
   @return length {number} 返回数组改变后的长度
*/
Array.prototype.unshiftElments = function(){
   return Array.prototype.unshift.apply(this, arguments[0]);
}
var arr = [1, 2, 3];
var length = arr.unshiftElments([1, 2]);
console.log(length); // 5
console.log(arr); // [1, 2, 1, 2, 3]

16. Array.prototype.slice

  • 返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改。
  • @param begin {number} 可选 开始索引,默认为0
  • @param end {number} 可选 结束索引,默认为length
  • @return {array} 拷贝后的数组
var arr = [1, 2, 3];
var arrCopy = arr.slice();
console.log(arrCopy); // [1, 2, 3]
arrCopy[0] = 0;
console.log(arrCopy); // [0, 2, 3]
console.log(arr); // [1, 2, 3] 

17. Array.prototype.splice

  • 通过删除现有元素和/或添加新元素来更改一个数组的内容 改变原数组
  • @param start {number} 指定修改的开始位置,默认为0
  • @param deleteCount {number} 可选 删除元素的个数,默认为arr.length-start;如果该值为0,表示不删除元素,则必须增加至少一个元素;如果该值省略,相当于把start(包括start)后面的元素都删除
  • @param itemN {arbitrary type} 可选 增加的元素,从start开始依次增加
  • @return {array} 由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
17.1 测试
var arr = [1, 2, 3];
var result = arr.splice(0, 1);
console.log(result); // [1]
console.log(arr); // [2, 3]
var arr = [1, 2, 3];
var result = arr.splice(1, 0, 1, 2, 3); 
console.log(result); // []
console.log(arr) // [1, 1, 2, 3, 2, 3]
17.2 使用数组替代itemN
/**
    在特定位置添加元素,改变原数组
    @param index {number} 索引
    @param arr {array} 需要添加的元素组成的数组
    @retruen {array} 返回添加后的数组的引用
*/
Array.prototype.addItems = function(){
    Array.prototype.unshift.apply(arguments[1], [arguments[0], 0]);
    Array.prototype.splice.apply(this, arguments[1]);
    return this;
}
var arr = [1, 2, 3];
var result = arr.addItems(1, [1, 2, 3]);
console.log(result); // [1, 1, 2, 3, 2, 3]

18. Array.prototype.some

  • 测试数组中的某些元素是否通过由提供的函数实现的测试。
  • @param callback {function} 说明测试条件的函数
    • @param currentValue {arbitrary type} 当前处理的元素
    • @param index {number} 可选 当前处理元素的索引
    • @param array {array} 可选 调用some函数的this(原数组)
  • @param thisArg {object} 可选 调用callback的this
  • @return {boolean} 如果数组有元素通过测试返回true,否则返回false
function callback(currentValue, index, array){
    return currentValue > 2;
}
var arr = [1, 2, 3];
console.log(arr.some(callback)); // true 
var arr = [0, 1, 2];
console.log(arr.some(callback)); // false

19.Array.prototype.toString

  • 返回一个字符串,表示指定的数组及其元素
  • @return {string} 数组元素组成的字符串
var arr = [1, 2, 3];
var result = arr.toString();
console.log(result) // '1, 2, 3'

20. Array.prototype.reduce

  • 对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。
  • @param callback {function} 调用的函数
    • @param accumulator {number} 累加器
    • @param currentValue {number} 当前处理的元素
    • @param currentIndex {number} 当前处理元素的索引
    • @param array {array} 原数组
  • @param initialValue {number} 累加器的初始值,默认为数组第一个元素
  • @return {number} 函数累加的结果
function callback(accumulator, currentValue,currentIndex, array){
    return accumulator + currentValue;
}
var arr = [1, 2, 3];
var result = arr.reduce(callback);
console.log(result); // 6
var result = arr.reduce(callback, 4);
console.log(result); // 10

21. Array.prototype.reduceRight

  • 接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。
  • @param callback {function} 调用的函数
    • @param accumulator {number} 累加器
    • @param currentValue {number} 当前处理的元素
    • @param currentIndex {number} 当前处理元素的索引
    • @param array {array} 原数组
  • @param initialValue {number} 累加器的初始值,默认为数组第一个元素
  • @return {number} 函数累加的结果
function callback(accumulator, currentValue,currentIndex, array){
    return accumulator + currentValue;
}
var arr = [1, 2, 3];
var result = arr.reduceRight(callback);
console.log(result); // 6
var result = arr.reduceRight(callback, 4);
console.log(result); // 10
原文地址:https://www.cnblogs.com/githubMYL/p/9580335.html