zoukankan      html  css  js  c++  java
  • 数组方法

    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
    
  • 相关阅读:
    @Autowired和@Resource注解的注入顺序
    八大排序算法(Java实现)+ 自制动画
    一文秒杀三个经典面试求和问题
    这篇文章,或许对还在上学的你,有一些帮助
    得了,一文把前缀和给扒的干干净净了。
    BF,BM,KMP,就这?
    那个贼贵的比特币到底是什么原理?
    小样?别以为你穿了几个马甲就不认得你是二分法!
    面试前必知必会的二分查找及其变种
    Vue.js 官方示例初探
  • 原文地址:https://www.cnblogs.com/githubMYL/p/9580335.html
Copyright © 2011-2022 走看看