zoukankan      html  css  js  c++  java
  • JavaScript 面试常问的九大数组方法

    1,复制数组
      1) Array.from
    var arr = [1,2,4];
    var arr2 = [];
    arr2 = Array.from(arr);
    arr.push(5);
    console.log(arr, arr2);
    //  [1, 2, 4, 5]  [1, 2, 4]
      2) Array.of()
    var arr = [1,2,4];
    var arr2 = [];
    arr2 = Array.of(...arr); //展开操作符(...)会把arr数组里的值都展开成参数
    arr.push(3);
    console.log(arr, arr2);
    //  [1, 2, 4, 3] [1, 2, 4]
       3) slice() 
    var arr = [1,2,3];
    var a = arr.slice();
    arr.push(4);
    console.log(a); // [1,2,3]
     
    2,类数组转数组
    Array.prototype.slice.call(arrayLike);
    Array.prototype.slice.apply(arrayLike);
    Array.from(arguments);
    [...arguments];
    常见类数组有:arguments对象,DOM方法返回的列表等。
     
    3,数组随机排序
    普通:
    var arr = [1,2,3,4,5,6,7,8,9,10];
    arr.sort(function(a,b) {
      return Math.random() > 0.5 ? -1 : 1
    });
    这样其实并不是完全随机,因为sort是依次比较的,前面的数字插到后面的概率越来越小。
    对同一组a、b的值,comparefn(a, b)需要总是返回相同的值。
    而Math.random() > 0.5并不满足这个条件。
     
    优化:随机交换
    function shuffle(arr) {
      var i, j;
      for(i = arr.length - 1; i > 0; i--){
        j = Math.floor(Math.random() * (i + 1));
        [arr[i], arr[j]] = [arr[j],arr[i]];
      }
      return arr;
    }
    4,扁平化n维数组
    function flatten(arr) {
      while(arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
      }
      return arr;
    }
    5,去重
    // ES6
    Array.from(new Set([1,2,3,3]));
    [... new Set([1,2,3,3])];
    // ES5
    Array.prototype.distinct = function(){
        var arr = this, result = [], i, j, len = arr.length;
        for(i = 0; i < len; i++){
            for(j = i + 1; j < len; j++){
                if(arr[i] === arr[j]){
                    j = ++i;
                }
             }
             result.push(arr[i]);
        }
        return result;
    }
    [1,2,3,3,4,4].distinct();            
     
    6,排序
    arr.sort(); // 默认升序
    arr.sort((a, b) => b - a); // 降序
    // 冒泡排序1 (j与j+1对比)
    var arr = [22,5,4,666,45,29];
    var flag = false;
    for(var i=0;i<arr.length-1;i++){
      for(var j=0;j<arr.length-1-i;j++){
        if(arr[j]>arr[j+1]){
          //升序
          //把较大的值赋给temp
          var temp = arr[j];
          arr[j] = arr[j+1];
          arr[j+1] = temp;
          flag = true;
        }
      }
      if(flag){
        flag = false;
      }else{
        break;
      }
    }
    // 冒泡排序2
    function bubleSort(arr) {
        let len = arr.length;
        for(let outer = len; outer >= 2; outer--) {
            for(let inner = 0; inner <= outer - 1; inner++) {
                if(arr[inner] > arr[inner + 1]) {
                  // 升序
            [arr[inner], arr[inner + 1]] = [arr[inner + 1], arr[inner]];
           }
          }
      }
      return arr;
    }
            
    // 选择排序 (选择i,与之对比)
    function selectSort(arr) {
      let len = arr.length;
      for(let i = 0; i < len; i++) {
        for(let j = i; j < len; j++) {
          if(arr[i] > arr[j]) {
            [arr[i], arr[j]] = [arr[j], arr[i]];
          }
        }
      }
      return arr;
    }
     
    7,最大值
    Math.max(...[1,2,3]);
    Math.max.apply(this, [1,2,3]);
    [1,2,3].reduce( (prev, cur, curIndex, arr) => {
      return Math.max(prev, cur);
    }, 0);
    var arr = [1,3,2];
    console.log(arr.sort()[arr.length - 1]);
     
    8,求和
    // reduce
    [1,2,3].reduce((prev, cur) => {
      return prev + cur ;
    }, 0);
    // slice截取数组,再递归求和。
    function sum(arr) {
      var len = arr.length;
      if(len === 0) {
        return 0;
      } else if (len === 1) {
        return arr[0];
      } else {
        return arr[0] + sum(arr.slice(1));
      }
    }
    9,判断数组中是否包含某个值
    arr.includes(item); // true/ false
    arr.indexOf(item); // -1 或者索引
    arr.find(item => item === 3); // 存在则返回item,否则undefined
    arr.findIndex(item => item === 3); // 存在则返回索引,否则-1
     
    以上。 
     

  • 相关阅读:
    数据结构和算法(Golang实现)(9)基础知识-算法复杂度及渐进符号
    基于深度学习方法的dota2游戏数据分析与胜率预测(python3.6+keras框架实现)
    基于CBOW网络手动实现面向中文语料的word2vec
    《Machine Learning Yearing》读书笔记
    使用神经网络预测航班起飞准点率
    使用LSTM-RNN建立股票预测模型
    基于selenium+phantomJS的动态网站全站爬取
    TensorFlow保存、加载模型参数 | 原理描述及踩坑经验总结
    学习笔记--python中使用多进程、多线程加速文本预处理
    通过外汇对冲手段稳定获利的可行性验证
  • 原文地址:https://www.cnblogs.com/easonw/p/10649054.html
Copyright © 2011-2022 走看看