实现数组reduce方法,js中的reduce

  实现数组reduce方法,js中的reduce

  

含义

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

  

语法

   arr.reduce(回调[,initial value]]参数

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

  当前值

  数组中正在处理的元素100 .当前索引可选

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

  调用减少的数组初始值可选

  用作第一个调用回收的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用减少将报错链接至返回值部分函数累计处理的结果

  

例子

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

  //1 遍历求和

  设count=0;

  设arr=[1,2,3,4,5];

  对于(设I=0;长度;i ) {

  count=arr[I];

  }

  console.log(计数);

  //输出15

  //2评估

  设count=eval([1,2,3,4,5]).join(" ");

  console.log(计数);

  //输出15

  //3减少

  让计数=[1,2,3,4,5]。reduce((a,b)=a b);

  console.log(计数);

  //输出15将二维数组转化为一维

  var flattened=[

  [0, 1],

  [2, 3],

  [4, 5],

  ].reduce((acc,cur)=acc.concat(cur),[]);计算数组中每个元素出现的次数

  var names=[Alice , Bob , Tiff , Bruce , Alice ];

  var计数名称=名称。减少(功能(所有名称,姓名){

  如果(所有姓名中的名称){

  所有姓名[姓名];

  }否则{

  所有姓名[姓名]=1;

  }

  返回所有名称;

  }, {});

  //countedNames是:

  //{ 爱丽丝:2,鲍勃:1,“Tiff”:1布鲁斯:1 }使用扩展运算符和initialValue绑定包含在对象数组中的数组

  //朋友-对象数组

  //其中对象字段"书籍"-最喜欢的书籍列表

  var friends=[

  {

  姓名:"安娜",

  书籍:[《圣经》《哈利波特》],

  年龄:21,

  },

  {

  姓名:"鲍勃",

  书籍:[《战争与和平》《罗密欧与朱丽叶》],

  年龄:26,

  },

  {

  名字:"爱丽丝",

  书籍:[《指环王》《闪灵》],

  年龄:18,

  },

  ];

  //所有书籍-包含所有朋友的书籍的列表

  初始值中包含的附加列表

  var allbooks=friends.reduce(

  函数(上一个,当前){

  返回[.上一页,curr。书籍];

  },

  [字母表]

  );

  //allbooks=[

  //字母表,圣经,哈利波特,战争与和平,

  //《罗密欧与朱丽叶》,《指环王》,

  //《闪灵》

  //]数组去重

  设arr=[1,2,1,2,3,5,4,5,3,4,4,4,4];

  let result=arr.sort().reduce((init,current)={

  如果(init。长度===0 init[init。length-1]!==当前){

  初始化推送(当前);

  }

  返回初始化

  }, []);

  console.log(结果);//[1,2,3,4,5]数组取最大值和最小值

  设数据=[1,4,2,2,4,5,6,7,8,8,9,10];

  //取最小值

  设min=data.reduce((x,y)=(x y?y:x));

  //取最大值

  设max=data.reduce((x,y)=(x y?x:y));

ES5的实现

   if(!Array.prototype.reduce) {

  对象。定义属性(数组。原型,“减少”,{

  value: function (callback /*,initialValue*/) {

  if (this===null) {

  抛出新类型错误(

  对空或不明确的调用了Array.prototype.reduce " "

  );

  }

  如果(回调类型!==函数){

  抛出新的类型错误(回调"不是函数");

  }

  //1.让O成为?对象(此值)。

  var o=Object(这个);

  //2.放过莱恩ToLength(?Get(O, length ).

  var len=o . length 0;

  //表示是带符号的右移:按照二进制把数字右移指定数位,高位如符号位为正补零,符号位负补一,低位直接移除

  //表示无符号的右移:按照二进制把数字右移指定数位,高位直接补零,低位移除。

  //步骤3、4、5、6、7

  var k=0;

  定义变量值;

  if (arguments.length=2) {

  值=参数[1];

  }否则{

  while (k len!(k in o)) {

  k;

  }

  //3.长度为0 且初始值不存在抛出异常

  if (k=len) {

  抛出新类型错误(

  没有初始值的空数组""的归约

  );

  }

  value=o[k];

  }

  //8.重复,当k len

  while (k len) {

  //a。让公园成为!ToString(k).

  //b。让kPresent成为?HasProperty(O,Pk).

  //c。如果kPresent为真,那么

  //我。设kValue为?得到(O,Pk).

  //二。让累加器去吧?打电话(

  //callbackfn,未定义,

  //累加器,kValue,k,O).

  if (k in o) {

  值=回调(value,o[k],k,o);

  }

  //d。将k增加1。

  k;

  }

  //9.回流蓄能器。

  返回值;

  },

  });

  }推荐学习:JavaScript视频教程以上就是深入解析射流研究…中数组减少方法(附代码)的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: