4 - every、some、reduce、reduceRight使用与重写

216 阅读1分钟

知识点:

forEach、filter、map、every、some的语法相同:arr.forEachfunction (elem, index, array) {}, thisArg);

reduce、reduceRight的语法相同:arr.reduce(function (prev, elem, index, array) {}, initialValue);

reduce、reduceRight不能改变this指向;

reduce跟reduceRight的区别:reduceRight遍历出来的数据是倒序的;

一、every()

  1. 如果有一个不满足条件就停止遍历,条件就是return后面的表达式;
  2. 返回一个boolean值

1.1 页面布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>forEach、filter、map使用与重写</title>
</head>
<body>
<div id="data" class="data" style="display: none">
    [
    {"id":"1","course":"前端开发1","is_free":"1"},
    {"id":"2","course":"前端开发2","is_free":"0"},
    {"id":"3","course":"前端开发3","is_free":"1"}
    ]
</div>
</body>
</html>  

1.2 every()的用法:课程为免费时,停止遍历

<script type="text/javascript">
    var data = JSON.parse(document.getElementById('data').innerHTML);
    var res = data.every(function (elem, index, array) {
            console.log(elem);
            return elem.is_free == '0';
        }, {name: 'test' })
    console.log(res);
</script>

1.3 在原型上重写every()

 Array.prototype.JEvery = function (fn) {
      var arr = this,
          arrLen = arr.length,
          arg2 = arguments[1] || window,
          res = true;
      for (var i = 0; i < arrLen; i++) {
          if (!fn.apply(arg2, [arr[i], i, arr])) {
              res = false;
              break;
          }
      }
      return res;
  }

1.4 调用在原型上重写的every()

var res = data.JEvery(function (elem, index, array) {
    console.log(elem);
    return elem.is_free === '0';
})
console.log(res);

二、some()

  1. 有一个满足条件就停止遍历,条件就是return后面的表达式;
  2. 返回一个boolean值

2.1 some()的用法:课程为免费时,停止遍历

var res = data.some(function (elem, index, array) {
    console.log(elem);
    return elem.is_free === '0';
}, null)
console.log(res);

2.2 在原型上重写some()

Array.prototype.JSome = function (fn) {
    var arr = this,
        arrLen = arr.length,
        arg2 = arguments[0] || window,
        res = false;
    for (var i = 0; i < arrLen; i++) {
        if (fn.apply(arg2, [arr[1], i, arr])) {
            res = true;
            break;
        }
    }
    return res;
}

2.3 调用在原型上重写的every()

var res = data.JSome(function (elem, index, array) {
    console.log(elem);
    return elem.is_free === '0';
})
console.log(res);

三、reduce()

3.1 reduce()的用法:找出免费课程

/**
 * reduce 归纳函数
 * reduce跟reduceRight的区别:reduceRight遍历出来的数据是倒序的
 * data.reduce(function(){})的本质是遍历,每一次遍历都会执行回调函数(function(){}),
 * 每一次执行回调函数,prev里面有值,每一次都可以对prev的值进行操作;
 * prev一开始是没有值的,它的值等于它的第二个参数;
 * 它的第二个参数是对象、数组...,prev就是个对象、数组...,
 * prev的初始值===intialValue的值;
 */

var initialValue = [];
var newArr = data.reduce(function (prev, elem, index, array) {
    if (elem.is_free === '1') {
        prev.push(elem);
    }
    return prev; //如果不return;只有第一次遍历的时候有值,其他时候为undefined
}, initialValue) //initialValue:变量,可以在外面声明; prev的初始值 = initialValue
console.log('newArr', newArr);

3.2 在原型上重写reduce()

//新增改变this指向功能(原生的reduce方法不能更改this指向)
Array.prototype.JReduce = function (fn, initialValue) {
    var arr = this,
        arrLen = arr.length,
        arg2 = arguments[2] || window,
        item;
    for (var i = 0; i < arr.length; i++) {
        initialValue = fn.apply(arg2, [initialValue, arr[i], i, arr]);
    }
    return initialValue;
}

3.3 调用在原型上重写的reduce()

var newArr = data.JReduce(function (prev, elem, index, array) {
    console.log(this); //{name: "test"}
    if (elem.is_free === '1') {
        prev.push(elem);
    }
    return prev;
}, [], {
    name: 'test'
})
console.log('newArr-JReduce', newArr)

四、reduceRight()

4.1 在原型上重写reduceRight()

Array.prototype.JReduceRight = function (fn, initialValue) {
    var arr = this,
        arrLen = arr.length,
        arg2 = arguments[2] || window,
        item;
    //reduceRight遍历出来的数据是倒序的;所以从arrLen-1项开始遍历
    for (var i = arrLen - 1; i >= 0; i--) {
        item = arr[i];
        initialValue = fn.apply(arg2, [initialValue, item, i, arr]);
    }
    return initialValue;
}

4.2 调用在原型上重写的reduceRight()

var newArr = data.JReduceRight(function (prev, elem, index, array) {
    console.log(this);
    if (elem.is_free === '1') {
        prev.push(elem);
    }
    return prev;
}, [], {
    name: 'test'
})
console.log('newArr-JReduceRight', newArr)

五、案例

5.1 将字符串从'='拆分,组合成对象形式

var cookieData = "BSHGA=JhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9;TTO=1285;OT_B=44555DESHFDK";
var cookieArr = cookieData.split(';');
console.log(cookieArr);
var obj = cookieArr.reduce(function (prev, elem) {
    var item = elem.split('=');
    prev[item[0]] = item[1];
    return prev
}, {})
console.log(obj)