js温故而知新3——进修廖雪峰的js教程

1.map

由于map()要领定义在JavaScript的Array中,我们挪用Array的map()要领,传入我们自身的函数,就得到了一个新的Array作为结果:

function pow(x) {
    return x * x;
}

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的参数是pow,即函数对象自身。

你能够会想,不需要map(),写一个轮回,也能够盘算出结果

map()作为高阶函数,事实上它把运算划定规矩笼统了,因而,我们不只能够盘算简朴的f(x)=x2,还能够盘算恣意庞杂的函数,比如,把Array的一切数字转为字符串:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']

只需要一行代码。

2.reduce

再看reduce的用法。Array的reduce()把一个函数作用在这个Array的[x1, x2, x3…]上,这个函数必需吸收两个参数,reduce()把结果继承和序列的下一个元素做积累盘算,其结果就是:

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)

比如说对一个Array乞降,就能够用reduce完成:

var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
    return x + y;
}); // 25

要把[1, 3, 5, 7, 9]变换成整数13579,reduce()也能派上用场:

var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
    return x * 10 + y;
}); // 13579

3.filter

filter也是一个经常运用的操纵,它用于把Array的某些元素过滤掉,然后返回剩下的元素。

和map()相似,Array的filter()也吸收一个函数。和map()差别的是,filter()把传入的函数顺次作用于每一个元素,然后依据返回值是true照样false决议保存照样抛弃该元素。

比方,在一个Array中,删掉偶数,只保存奇数,能够这么写:

var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
    return x % 2 !== 0;
});
r; // [1, 5, 9, 15]

把一个Array中的空字符串删掉,能够这么写:

var arr = ['A', '', 'B', null, undefined, 'C', '  '];
var r = arr.filter(function (s) {
    return s && s.trim(); // 注重:IE9以下的版本没有trim()要领
});
r; // ['A', 'B', 'C']

可见用filter()这个高阶函数,关键在于准确完成一个“挑选”函数。

3.1回调函数

filter()吸收的回调函数,实在能够有多个参数。一般我们仅运用第一个参数,示意Array的某个元素。回调函数还能够吸收别的两个参数,示意元素的位置和数组自身:

var arr = [‘A’, ‘B’, ‘C’];
var r = arr.filter(function (element, index, self) {

console.log(element); // 顺次打印'A', 'B', 'C'
console.log(index); // 顺次打印0, 1, 2
console.log(self); // self就是变量arr
return true;

});

应用filter,能够奇妙地去除Array的反复元素

'use strict';

var
    r,
    arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange',             'orange', 'strawberry'];
    
    r = arr.filter(function (element, index, self) {
    return self.indexOf(element) === index;
});

去除反复元素依托的是indexOf老是返回第一个元素的位置,后续的反复元素位置与indexOf返回的位置不相等,因而被filter滤掉了。

4.sort

JavaScript的Array的sort()要领就是用于排序的,然则排序结果能够让你大吃一惊:

// 看上去一般的结果:
['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];

// apple排在了末了:
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']

// 没法明白的结果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

第二个排序把apple排在了末了,是由于字符串依据ASCII码举行排序,而小写字母a的ASCII码在大写字母以后。

第三个排序结果是什么鬼?简朴的数字排序都能错?

这是由于Array的sort()要领默许把一切元素先转换为String再排序,结果’10’排在了’2’的前面,由于字符’1’比字符’2’的ASCII码小。

要按数字大小排序,我们能够这么写:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
}); // [1, 2, 10, 20]

假如要倒序排序,我们能够把大的数放前面:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
    if (x < y) {
        return 1;
    }
    if (x > y) {
        return -1;
    }
    return 0;
}); // [20, 10, 2, 1]

默许情况下,对字符串排序,是根据ASCII的大小比较的,如今,我们提出排序应当疏忽大小写,根据字母序排序。要完成这个算法,没必要对现有代码大加修正,只需我们能定义出疏忽大小写的比较算法就能够

var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
    x1 = s1.toUpperCase();
    x2 = s2.toUpperCase();
    if (x1 < x2) {
        return -1;
    }
    if (x1 > x2) {
        return 1;
    }
    return 0;
}); // ['apple', 'Google', 'Microsoft']

末了友谊提醒,sort()要领会直接对Array举行修正,它返回的结果还是当前Array:

var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是统一对象

    原文作者:chinawzc
    原文地址: https://segmentfault.com/a/1190000008641084
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞