var flatten = function(input, shallow, strict, startIndex) { var output = [], idx = 0; for (var i = startIndex || 0, length = input && input.length; i < length; i++) { var value = input[i]; if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { if (!shallow) value = flatten(value, shallow, strict); var j = 0, len = value.length; output.length += len; while (j < len) { output[idx++] = value[j++]; } } else if (!strict) { output[idx++] = value; } } return output; };
主要是利用了递归,首先循环数组,若是数组内部元素是数组,则对其递归调用自身函数。不然直接将其值赋给Output数组,原理相似于对象的深度clone函数。javascript
function cloneObject(src) { var obj; if (typeof src === 'object') { // 须要注意的是对typeof对null也返回'object' if (src === null) { obj = null; } else { obj = {}; for (var k in src) { if (src.hasOwnProperty(k)) { obj[k] = (typeof src[k] === 'object') ? cloneObject(src[k]) : src[k]; } } } } else { obj = src; } return obj; }
for (var i = 0, length = array.length; i < length; i++) { var value = array[i]; var result = []; if (!_.contains(result, value)) { result.push(value); } return result;
方法相似于经常使用的去重方法,定义一个空对象,将数组每项的值做为对象的属性,检测对象的属性是否存在,若是不存在,则将其push到结果数组中,并给这个属性设值,这样下次有相同的值,那么这个属性就是存在的。这里是依赖内部的_.contains函数来实现的。java
for (var i = 0, length = array.length; i < length; i++) { var value = array[i]; var result = []; var a = {}; if (!a[value]) { a[value] = 1; result.push(value); } return result;
_.sortedIndex = function(array, obj, iteratee, context) { iteratee = cb(iteratee, context, 1); var value = iteratee(obj); var low = 0, high = array.length; while (low < high) { var mid = Math.floor((low + high) / 2); if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; } return low; };
-ps: 发现_.range里一个var range = Array(length);这种不加new的,还有其余库里new调用构造函数不加括号的,js真的很灵活。。数组