首页前端开发JavaScript深入解析JS中数组reduce方法(附代码)

深入解析JS中数组reduce方法(附代码)

时间2024-01-30 04:55:02发布访客分类JavaScript浏览869
导读:收集整理的这篇文章主要介绍了深入解析JS中数组reduce方法(附代码),觉得挺不错的,现在分享给大家,也给大家做个参考。之前的文章《浅谈Vue中key取值影响过渡效果和动画效果(代码详解)》中,给大家了解一下Vue中key取值影响过渡效果...
收集整理的这篇文章主要介绍了深入解析JS中数组reduce方法(附代码),觉得挺不错的,现在分享给大家,也给大家做个参考。

之前的文章《浅谈Vue中key取值影响过渡效果和动画效果(代码详解)》中,给大家了解一下Vue中key取值影响过渡效果和动画效果。下面本篇给大家了解一下JS中数组reduce方法,有一定的参考价值,有需要的朋友可以参考一下。

含义

reduce()方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。

语法

arr.reduce(callback[, inITialValue])

参数

callback执行数组中每个值的函数,包含四个参数:accumulator累加器累加回调的返回值;它是上一次调用回调时返回的累积值,或initialValue(如下所示)。

currentValue

数组中正在处理的元素。currentIndex可选

数组中正在处理的当前元素的索引。 如果提供了initialValue,则索引号为 0,否则为索引为 1。array可选

调用reduce的数组initialValue可选

用作第一个调用callback的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce将报错。Link to section返回值函数累计处理的结果

例子

求数组[1,2,3,4,5]里所有值的和

// 1 遍历求和let count = 0;
    let arr = [1, 2, 3, 4, 5];
    for (let i = 0;
     i  arr.length;
 i++) {
      count += arr[i];
}
    console.LOG(count);
    // output 15// 2 evallet count = eval([1, 2, 3, 4, 5].join("+"));
    console.log(count);
    // output 15// 3 reducelet count = [1, 2, 3, 4, 5].reduce((a, b) =>
     a + b);
    console.log(count);
    // output 15

将二维数组转化为一维

VAR flattened = [  [0, 1],  [2, 3],  [4, 5],].reduce((acc, cur) =>
     acc.concat(cur), []);
    

计算数组中每个元素出现的次数

var names = ["Alice", "Bob", "Tiff", "bruce", "Alice"];
var countedNames = names.reduce(function (allNames, name) {
  if (name in allNames) {
        allNames[name]++;
  }
 else {
        allNames[name] = 1;
  }
      return allNames;
}
, {
}
    );
// countedNames is:// {
 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
    

使用扩展运算符和initialValue绑定包含在对象数组中的数组

// friends - an array of objects// where object field "Books" - list of favorite booksvar friends = [  {
    name: "Anna",    books: ["Bible", "Harry Potter"],    age: 21,  }
,  {
    name: "Bob",    books: ["War and PEace", "romeo and Juliet"],    age: 26,  }
,  {
    name: "Alice",    books: ["The Lord of the Rings", "The Shining"],    age: 18,  }
    ,];
// allbooks - list which will contain all friends' books +// additional list contained in initialValuevar allbooks = friends.reduce(  function (prev, curr) {
        return [...PRev, ...curr.books];
  }
    ,  ["Alphabet"]);
    // allbooks = [//   'Alphabet', 'Bible', 'Harry Potter', 'War and peace',//   'Romeo and Juliet', 'The Lord of the Rings',//   'The Shining'// ]

数组去重

let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
    let result = arr.sort().reduce((init, current) =>
 {
  if (init.length === 0 || init[init.length - 1] !== current) {
        init.push(current);
  }
      return init;
}
    , []);
    console.log(result);
     //[1,2,3,4,5]

数组取最大值和最小值

let data = [1, 4, 2, 2, 4, 5, 6, 7, 8, 8, 9, 10];
    //取最小值let min = data.reduce((x, y) =>
     (x >
     y ? y : x));
    //取最大值let max = data.reduce((x, y) =>
     (x >
     y ? x : y));
    

ES5的实现

if (!Array.prototype.reduce) {
  Object.defineProperty(Array.prototype, "reduce", {
    value: function (callback /*, initialValue*/) {
      if (this === null) {
            throw new TypeError(          "Array.prototype.reduce " + "called on null or undefined"        );
      }
      if (typeof callback !== "function") {
            throw new TypeError(callback + " is not a function");
      }
          // 1. Let O be ? ToObject(this value).      var o = Object(this);
          // 2. Let len be ? ToLength(? Get(O, "length")).      var len = o.length >
    >
    >
     0;
          // >
    >
    表示是带符号的右移:按照二进制把数字右移指定数位,高位如符号位为正补零,符号位负补一,低位直接移除      //  >
    >
    >
    表示无符号的右移:按照二进制把数字右移指定数位,高位直接补零,低位移除。      // Steps 3, 4, 5, 6, 7      var k = 0;
          var value;
          if (arguments.length >
= 2) {
            value = arguments[1];
      }
 else {
            while (k  len &
    &
 !(k in o)) {
              k++;
        }
            // 3. 长度为0 且初始值不存在 抛出异常        if (k >
= len) {
              throw new TypeError(            "Reduce of empty array " + "with no initial value"          );
        }
            value = o[k++];
      }
      // 8. Repeat, while k  len      while (k  len) {
        // a. Let Pk be ! ToString(k).        // b. Let kPresent be ? HasProperty(O, Pk).        // c. If kPresent is true, then        //    i.  Let kValue be ? Get(O, Pk).        //    ii. Let accumulator be ? Call(        //          callbackfn, undefined,        //          « accumulator, kValue, k, O »).        if (k in o) {
              value = callback(value, o[k], k, o);
        }
            // d. Increase k by 1.        k++;
      }
          // 9. Return accumulator.      return value;
    }
,  }
    );
}
    

推荐学习:JavaScript视频教程

以上就是深入解析JS中数组reduce方法(附代码)的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: 你值得了解的JavaScript“继承之...下一篇:如何用js从字符串中删除所有非AS...猜你在找的JavaScript相关文章 html font标签如何设置字体大小?html font标签属性用法介绍2022-05-16vue3+TypeScript+vue-router的使用方法2022-04-16vue3获取当前路由地址2022-04-16如何利用React实现图片识别App2022-04-16JavaScript展开运算符和剩余运算符的区别详解2022-04-16微信小程序中使用vant框架的具体步骤2022-04-16Vue elementUI表单嵌套表格并对每行进行校验详解2022-04-16如何利用Typescript封装本地存储2022-04-16微信小程序中wxs文件的一些妙用分享2022-04-16JavaScript的Set数据结构详解2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: 深入解析JS中数组reduce方法(附代码)
本文地址: https://pptw.com/jishu/592067.html
深入浅析JavaScript中的回调函数 JS数组学习之如何根据数组下标删除任意元素

游客 回复需填写必要信息