javaScript 高阶函数 map/reduce/filter

时间:2022-05-03 18:43:20

1、高阶函数 — 一个函数接收另一个函数作为参数的函数。

function add(x, y, f) {
return f(x) + f(y);
}

2、filter — 基于回调函数剩余满足条件的Array元素

filter()接收的回调函数,可以有多个参数,通常仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身.

//通过filter保留素数
function get_primes(arr) {
//filter保留返回为true的元素
var r = arr.filter(function(x){
if(x==1) return false;
for (var i = 2; i<x; i++)
{
if(x%i==0)
return false;
}
return true;
}) ;
return r;
}

3、map — 基于原元素的映射方式

  • 作用于 JavaScript Array 上返回f(x)构成的新的元素 Array
  • To the callback function(Function that produces an element of the new Array), Array.prototype.map passes 3 arguments( the element, the index, the array)
    • currentValue:The current element being processed in the array.
    • index:The index of the current element being processed in the array.
    • array:The array map was called upon.
    • thisArg:Optional. Value to use as this when executing callback.
    • Return value:A new array with each element being the result of the callback function.
#把Array的所有数字,返回字符串
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
#把二维度对象数组变为单维度对象数组
var kvArray = [{key:1, value:10},
{key:2, value:20},
{key:3, value: 30}];
#注意:这里针对每个对象,都返回一个新的对象.整个map作用后返回新array.
var reformattedArray = kvArray.map(function(obj){
var rObj = {};
rObj[obj.key] = obj.value;
return rObj;
});
#reformattedArray is now [{1:10}, {2:20}, {3:30}]
  • 扩展map:作用于String/集合的 Array.prototype.map.call(obj,function(){})
var map = Array.prototype.map;
var a = map.call('Hello World', function(x) {
return x.charCodeAt(0);
});
//a now equals [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
//作用于 a collection of objects collected by querySelectorAll
var elems = document.querySelectorAll('select option:checked');
var values = Array.prototype.map.call(elems, function(obj) {
return obj.value;
});
//注意:通过作用于String来reverse反转字符串,可用于判断回文序列.
//Array.prototype.map() 原本是作用在 array 元素上并返回新的array的。
//用法一:扩展至 String
var str = '12345';
Array.prototype.map.call(str, function(x) {
return x;
}).reverse().join('');

// Output: '54321'
// Bonus: use '===' to test if original string was a palindrome

//用法二:扩展至 javaScript 的 querySelectorAll 返回的 collections上
var elems = document.querySelectorAll('select option:checked');
var values = Array.prototype.map.call(elems, function(obj) {
return obj.value;
});

4、reduce — 从左至右累计元素值归纳至一个值

  • [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
    语法:arr.reduce(callback, [initialValue])
var flattened = [[0, 1], [2, 3], [4,5]].reduce(function(a, b) { 
return a.concat(b);
}, []);
// flattened is [0, 1, 2, 3, 4, 5]

//练习:不要使用JavaScript内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数:

function string2int(s) {
var n = Array.prototype.map.call(s, function(x) {
return x - '0'
});
var m = n.reduce(function(x,y){
return x*10+y;});
return m;
}
// 测试: string2int('12300') === 12300

参考材料