Creating _.reduce from scratch(从头开始创建_.duce)
问题描述
我试图从头开始从下划线库重新创建_.duce方法,但我有三个测试用例失败。1.即使迭代器返回UNDEFINED,也应该继续调用迭代器。2.如果传入备忘录,则应将数组的每一项都传递到迭代器中。3.如果没有传入备忘录,应该首先将数组的第二项传递到迭代器中。我一直在查看文档,我以为迭代器(累加器,集合[1],1,集合)会涵盖第三种情况,但我猜不会。
_.reduce = function(collection, iterator, accumulator) {
    // TIP: To support both arrays and objects, try re-using each() here
    if (accumulator === undefined) {
      accumulator = collection[0];
      iterator(accumulator, collection[1]);
    }
    _.each(collection, function(val) {
      iterator(accumulator, val);
    }
    );
    return accumulator;
  };
推荐答案
一些问题:
在
accumulator未定义的情况下,代码首先使用collection[1]调用iterator,但如果collection不是数组,这将不表示集合的第二个元素。例如,{a:1, b:2}中的第二个元素将是collection.b。如果
accumulator未定义,您的代码仍将继续执行_.each,它将对您希望避免的集合的第一个元素调用iterator.您的代码忽略了
iterator调用返回的值。它应捕获此返回值并将其分配给accumulator应使用第三个参数调用
iterator:值的索引/键。应使用第四个参数调用
iterator:正在迭代的完整集合
更正:
_.reduce = function(collection, iterator, accumulator) {
    _.each(collection, function(val, i) {
        if (accumulator === undefined && i === 0) accumulator = val;
        else accumulator = iterator(accumulator, val, i, collection);
    });
    return accumulator;
};
// Tests
console.log(_.reduce([1,2,3], (a, b) => a+b, 1) === 7);
console.log(_.reduce([1,2,3], (a, b) => a+b) === 6);
console.log(_.reduce({a: 1, b: 2, c:3}, (a, b, i) => a+b, 0) === 6);
console.log(_.reduce({a: 1, b: 2, c:3}, (a, b, i) => a+i, "") === "abc");
console.log(_.reduce([], (a, b) => a+b, 0) === 0);
console.log(_.reduce([], (a, b) => a+b) === undefined);
console.log(_.reduce([1,2,3], (a, b, i, all) => a + b * all[i-1]
) === 9);
<script src="aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS91bmRlcnNjb3JlQDEuMTMuMS91bmRlcnNjb3JlLXVtZC5taW4uanM="></script>
这篇关于从头开始创建_.duce的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从头开始创建_.duce
				
        
 
            
        - CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
 - 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
 - 失败的 Canvas 360 jquery 插件 2022-01-01
 - Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
 - Flexslider 箭头未正确显示 2022-01-01
 - 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
 - 400或500级别的HTTP响应 2022-01-01
 - addEventListener 在 IE 11 中不起作用 2022-01-01
 - Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
 - Fetch API 如何获取响应体? 2022-01-01
 
						
						
						
						
						