reduce

reduce

基本用法

/**
 * @param {callback} 执行数组中每个值的函数,包含四个参数
 *  1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
 *  2、currentValue (数组中当前被处理的元素)
 *  3、index (当前元素在数组中的索引)
 *  4、array (调用 reduce 的数组
 * @param  {initialValue} 这个最好写,当数组为空的时候要报错
    结论:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
 */
let arr = [1, 2, 3, 4];
arr.reduce(callback, [initialValue]);

高级用法

  • 计算数组中每个元素出现的次数
let names = ["Alice", "Bob", "Tiff", "Bruce", "Alice"];
let nameNum = names.reduce((pre, cur) => {
  if (cur in pre) {
    pre[cur]++;
  } else {
    pre[cur] = 1;
  }
  return pre;
}, {});
  • 数组去重
let arr = [1, 2, 3, 4, 4, 1];
let newArr = arr.reduce((pre, cur) => {
  if (!pre.includes(cur)) {
    return pre.concat(cur);
  } else {
    return pre;
  }
}, []);
console.log(newArr); // [1, 2, 3, 4]

— 将二维数组转化为一维

let arr = [[0, 1], [2, 3], [4, 5]];
let newArr = arr.reduce((pre, cur) => {
  return pre.concat(cur);
}, []);
console.log(newArr); // [0, 1, 2, 3, 4, 5]
  • 将多维数组转化为一维
let arr = [[0, 1], [2, 3], [4, [5, 6, 7]]];
const newArr = function(arr) {
  return arr.reduce(
    (pre, cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur),
    []
  );
};
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
  • 对象里的属性求和
var result = [
  {
    subject: "math",
    score: 10
  },
  {
    subject: "chinese",
    score: 20
  },
  {
    subject: "english",
    score: 30
  }
];

var sum = result.reduce(function(prev, cur) {
  return cur.score + prev;
}, 0);
console.log(sum); //60

  转载请注明: 迷一样的自信 reduce

 上一篇
forEach、map、some、every forEach、map、some、every
forEach、map、some、everyforEach break,return是无法跳出循环 没有任何的返回 undefined 终止forEach 在forEach中使用break并不能终止循环 return false 只是下面
2018-03-31
下一篇 
模块的加载 模块的加载
模块的加载AMD  AMD(异步模块定义) 被requireJS,NodeJs,Dojo,JQuery使用 /** * @param name 模块标识,可以省略 * @param dependencyModule 所依赖的模块,可以
2018-03-24
  目录