zoukankan      html  css  js  c++  java
  • js的数组的一些操作

    1 arr.reduce

    let xxx = arr.reduce( function (pv, cv, ci ,arr) {
         return 
    }[, init_val] )

    对arr的每个元素,执行匿名函数fun,并将返回值作为下一次调用fun的pv。
    pv:pre value,上一次执行后返回的值。
    cv:current value,当前操作对应的索引对应的值。
    ci:current index,当前操作对应的索引。
    arr:执行当前操作的数组。

    当没有init_val的时候,跳过arr[0],默认从index=1开始执行,arr[0]直接充当pv。

    当有init_val的时候,从index=0开始执行,init_val充当pv。

    let arr = [1,2,3,4]
    
    let = sum = arr.reduce(function (pr, cv, ci, arr) {
        console.log(pr, cv, ci);
        return pr + cv;
    })
    
    console.log(sum);

    直接从2开始的,1直接作pr

    let arr = [1,2,3,4]
    
    let = sum = arr.reduce(function (pr, cv, ci, arr) {
        console.log(pr, cv, ci);
        return pr + cv;
    }, 0)
    
    console.log(sum);

    从1开始,0作pr,符合前缀和的逻辑
    let arr = [1,2,3,4]
    
    let = sum = arr.reduce(function (pr, cv, ci, arr) {
        console.log(pr, cv, ci);
        return pr + cv;
    }, 5)
    
    console.log(sum);

    从1开始,相当于初值为5的前缀和

     不知道有什么用,反正没有原生的快就完事了。

    2 arr.forEach

    看完reduce就不得不顺便看一下forEach了

    arr.forEach( function (cv, ci, arr) {
    
    }[, thisvalue] )

    这个thisvalue参数,我至今不知道可以怎么用。

    各个参数含义和reduce一样,其中cv是必须的。

    其实就是循环。

    3 arr.map

    那也就比逊顺便说一下map了

    let new_arr = arr.map(function (cv, ci, arr) {
        return ;
    })

    返回值是一个新数组,新数组中的每个值等于对应旧数组当时在匿名函数里的返回值

    例如,返回一个数组,是每个值的平方

      let arr = [1,2,3,4]

    let new_arr = arr.map(function (cv, ci, arr) { return cv * cv; }) console.log(new_arr);

    总结一下:

    reduce 和 map都需要返回值,reduce返回的是一个值,而其每次的返回值,作为下一次运算的参数pv。

    而map返回的是一个数组,新数组的每个值等于匿名函数的return值。

    forEach的匿名函数不需要返回值,就是一个简单的循环,不产生新的东西。

    但是不能这么写

    let arr = [1,2,3,4]
    arr.forEach(function (cv, ci, arr) {
        cv = cv * cv;
    })
    console.log(arr);

    这个cv只是一个形参,arr的值不会变的。

    必须写成

    arr[ci] = cv * cv;

    4 arr.filter()

    这也是一个比较好用的api,字面意思,用于过滤一些元素

    let new_arr = arr.filter(function (cv, vi ,arr) {
        return true or false;
    })

    true保留,false删掉。

    5 arr.sort()

    注*:不能对数字数组直接排序,因为会先化为字符串。用法和c艹的cmp一样,给sort传入一个cmp函数,注意顺序是反的,< 返回true是从大到小。

    function cmp (x, y) {
        return x > y ? true : false;
    }
    console.log([10, 20, 1, 2].sort());
    console.log([10, 20, 1, 2].sort(cmp));
      

    6.数组去重并排序

    1 let arr = [1,2,3,3,5,6,7,5,3,8,9,23,22,7,23,1];
    2 // let arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
    3 
    4 let new_arr = (arr.filter(function (cv, ci, arr) {
    5     return arr.indexOf(cv) === ci;
    6 })).sort((a, b) => {return a > b});
    7 
    8 console.log(new_arr);

     

    7.Array.find() 和 findIndex()

    arr.find((value, index, arr) => {
      return value > 4;
    })
    
    arr.findIndex((value, index, arr) => {
      return value > 4;
    })

    find 返回值

    findIndex 返回下标

    我觉得是不是利用自身的迭代器是不是比for + break快

  • 相关阅读:
    Netty5.x中新增和值得注意的点(转载http://www.coderli.com/netty-5-new-and-noteworthy/)
    PAT A1143 Lowest Common Ancestor [二叉搜索树LCA]
    PAT A1136 A Delayed Palindrome [大数加法]
    PAT A1047 Student List for Course [字符串映射]
    PAT A1022 Digital Library [输入输出 STL]
    输入输出格式总结
    算法题面生词汇总
    PAT A1044 Shopping in Mars [二分]
    PAT A1010 Radix [二分]
    算法的时间复杂度分析
  • 原文地址:https://www.cnblogs.com/liwenchi/p/10661909.html
Copyright © 2011-2022 走看看