手写 Lodash (2)
这里参考的是 lodash.js 4.17.21
1. 先看这次要达到的效果
var result1 = _({
a: 1, b: 2}).keys().value();
var result2 = _([1,2,3,4,5])
.map((i) => {
return i + 1}).value();
var result3 = _([1,2,3,4,5]).take(2).value();
console.log('result1: ', result1); //['a', 'b']
console.log('result2: ', result2); //[2, 3, 4, 5, 6]
console.log('result3: ', result3); //[1, 2]
这次我要达到的效果:链式调用
2. 开始手写
为了能更好的表达重点,代码只写核心逻辑。
像一些错误提示,判断类型之类的这里会省略。
2.1 这是第一期的代码
function keys(value) {
return Object.keys(value);
}
function map(value, fn) {
var ks = keys(value);
var values = ks.map(k => value[k]);
return values.map(fn);
}
function take(array, takecount) {
if (takecount === undefined) {
return array.slice(0, 1);
}
else if (takecount === 0) {
return [];
}
else if (takecount >= array.length) {
return array;
}
else if (takecount < array.length){
return array.slice(0, takecount)
}
}
var _ = {
};
_.keys = keys;
_.map = map;
_.take = take;
2.2 接着写
这一次我们要实现链式调用
思路:
每次调用链式方法,我们其实都没有立刻去执行它,而是把方法存起来,然后返回了一个对象,这个对象能获取到我们所有的链式方法。
直到我们调用 value 方法, 才会真的去执行那些我们存起来的方法,最后返回结果。
记住我们实现链式调用时,也要保持非链式调用时能用
代码:
function