码迷,mamicode.com
首页 > 其他好文 > 详细

underscore collections

时间:2015-08-17 21:24:50      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

_.each(list, iterator, [context]):对集合中每一元素执行处理器方法.

如果传递了context参数,则把iterator绑定到context对象上。每次调用iterator都会传递三个参数:(element, index, list)。如果list是个JavaScript对象,iterator的参数是 (value, key, list))。如果存在原生的forEach方法,Underscore就使用它代替。

var each = _.each = _.forEach = function(obj, iterator, context) {
	//不处理null
	if (obj == null) return;
	//宿主环境支持foreach,则优先调用
	if (nativeForEach && obj.forEach === nativeForEach) {
	  obj.forEach(iterator, context);
	//obj.length是number,以后for循环都需要加这个条件
	} else if (obj.length === +obj.length) {
	  //obj为数组
	  for (var i = 0, l = obj.length; i < l; i++) {
	  	//i是obj的序号,iterator的返回值如果是breaker的话,则终止;breaker是内部对象,只在any中进行调用
	    if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
	  }
	} else {
	  //obj为对象
	  for (var key in obj) {
	  	//不考虑原型链的属性
	    if (_.has(obj, key)) {
	      if (iterator.call(context, obj[key], key, obj) === breaker) return;
	    }
	  }
	}
};

_.map(list, iterator, [context]) :通过变换函数(iterator迭代器)把list中的每个值映射到一个新的数组中

_.map = _.collect = function(obj, iterator, context) {
	var results = [];
	if (obj == null) return results;
	if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
	each(obj, function(value, index, list) {
	  //自增数组;iterator需要有返回值;
	  results[results.length] = iterator.call(context, value, index, list);
	});
	//如果是数组的话,一定要返回相同长度的新数组
	if (obj.length === +obj.length) results.length = obj.length;
	return results;
};

var a = [1,2,3,4,5];
var result = _.map(a, function(value){
  if(value < 3){
    return value%2 ? value:0;
  }
})
console.log(result);

_.reduce():list中元素归结为一个单独的数值  

Memo是reduce函数的初始值,reduce的每一步都需要由iterator返回。这个迭代传递4个参数:memo, value 和 迭代的index(或者 key)和最后一个引用的整个 list。

_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
	var initial = arguments.length > 2;
	if (obj == null) obj = [];
	if (nativeReduce && obj.reduce === nativeReduce) {
	  //为什么用bind,而不用call方法呢?
	  if (context) iterator = _.bind(iterator, context);
	  return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
	}
	each(obj, function(value, index, list) {
	  if (!initial) {
	  	//如果没有memo,则把第一个值作为memo;只是考虑第一次的情况,真巧妙
	    memo = value;
	    initial = true;
	  } else {
	    memo = iterator.call(context, memo, value, index, list);
	  }
	});
     //TypeError:内置的js对象 if (!initial) throw new TypeError(‘Reduce of empty array with no initial value‘); return memo; }; 

underscore collections

标签:

原文地址:http://www.cnblogs.com/wang-jing/p/4737601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!