我们接下来引见函数式语言中3个罕见的函数:Map,Filter,Reduce。
敕令式代码与声明式代码
前面我们引见了函数式编程中罕见的几种函数,下面我们要最先转变观念了。
敕令式代码的意义就是,我们经由过程编写一条又一条指令去让计算机实行一些行动,这个中平常都邑涉及到许多冗杂的细节。 而声明式就要文雅许多了,我们经由过程写表达式的体式格局来声明我们想干什么,而不是经由过程一步一步的指导。
// 敕令式
const makes = [];
for (i = 0; i < cars.length; i++) {
makes.push(cars[i].make);
}
// 声明式
var makes = cars.map(function(car){ return car.make; });
我们看下es5 Map,Filter,Reduce函数的简朴完成。
Array.prototype.map = function(f) {
const newArray = [];
const O = Object(this);
for (let i = 0; i < O.length; i++) {
newArray[i] = f(O[i]);
}
return newArray;
}
Array.prototype.filter = function(pred) {
const newArray = [];
for (var i = 0; i < this.length; ++i) {
if (pred(this[i]))
newArray[newArray.length] = this[i];
}
return newArray;
}
Array.prototype.reduce = function(f, start) {
var acc = start;
for (var i = 0; i < this.length; ++i)
acc = f(this[i], acc); // f() 接收2个参数
return acc;
};
这3个罕见的函数会在我们函数式编程中经常出现的三个函数。
有一点须要申明的是,for轮回是自然语言的处理结果,永远是比map快的。这个就须要你本身在编写代码的时刻对利害举行衡量。
一段函数式编程的综合运用
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.11/require.min.js"></script>
<script>
requirejs.config({
paths: {
ramda: 'https://cdnjs.cloudflare.com/ajax/libs/ramda/0.13.0/ramda.min',
jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min'
}
});
require([
'ramda',
'jquery'
],
(_, $) => {
const Impure = {
getJSON: _.curry((callback, url) => {
$.getJSON(url, callback);
}),
setHtml: _.curry((sel, html) => {
$(sel).html(html);
})
};
const img = url => $('<img />', { src: url });
const trace = _.curry((tag, x) => {
console.log(tag, x);
return x;
});
const url = t => 'https://api.flickr.com/services/feeds/photos_public.gne?tags=' + t + '&format=json&jsoncallback=?';
const mediaUrl = _.compose(_.prop('m'), _.prop('media'));
const srcs = _.compose(_.map(mediaUrl), _.prop('items'));
const images = _.compose(_.map(img), srcs);
const renderImages = _.compose(Impure.setHtml("body"), images);
const app = _.compose(Impure.getJSON(renderImages), url);
app("cats");
}
);
</script>
</head>
<body></body>
</html>