基本的遍历
each
javascript中自带了for和for in来分别遍历数组和对象,underscore则提供了一种通用的迭代器来遍历
// 遍历数组
var arr = [];
_.each(arr,function(n,i,self){
// n是数组元素
// i是数组元素下标
// self指向arr自己
});
// 遍历对象
var obj = {};
_.each(obj,function(value,key,self){
// value是键值
// key是键名
// self指向obj自己
});
- 遍历数组的时候,请记住函数签名跟jquery的each正好相反
- each不能像jquery那样通过”return false”来跳出循环
- es5中,可以用forEach来替代underscore的each(其实underscore中的源码里会优先使用forEach)
find
很多时候我们只想找collection其中的一个值
var arr = [1,2,3];
var two = _.find(arr,function(n){return n==2;});
// two = 2;
- find会在函数返回true的时候停止遍历
- each完全可以用find来替代
map
映射函数
// 我们要把函数中的值都*2
var arr = [1,2,3];
var doubleArr = _.map(arr,function(n){return n*2;});
// doubleArr = [2,4,6];
- map会把函数中返回的值依次填充到一个”新”collection中去,而不会改变原来的collection
- es5中,map有原生的实现
filter
filter可以看成是find的完全遍历版本.它把返回true的依次装入”新”collection中去
var arr = [1,2,3,4];
var doubleArr = _.filter(arr,function(n){return n%2==0;});
// doubleArr = [2,4];
例子
去除数组中重复的数字
var arr = [1,1,2,3,4,1,2];
var dict = {};
var newArr = _.filter(arr,function(n){
if(dict[n] === undefined){
dict[n] = true;
return true;
}
});
// es6中可以简单的用Set